BLOGSpeee開発陣による技術情報発信ブログです。非同期処理Tweet最近「白猫プロジェクト」をやりまくってる「僧職系エンジニア」です。ミラLv100、アンナLv98、クライブLv90のPTで頑張ってます!今回は実際の業務でiOS/Androidの非同期通信のロジックを書いてみて感じたことと、実際にどうやったらその問題を解決出来るかを記事にしました。同じ事に悩んでるネイティブエンジニアの役に立てたらいいなぁ。iOS/Android開発の移行作業についてそもそも異なる言語を使っているため、移行作業はどうしても発生しますがその中でも特に「非同期処理」の移行作業が一番ストレス感じます。非同期処理なので処理終了後に呼び出してもらいたい処理をiOSだとBlock、AndroidだとInterfaceでメソッドに渡しますが、そのパターンも成功時と失敗時は別々のコールバックで処理する成功時と失敗時は同一のコールバックで処理する失敗時は無視して、成功時のみ処理する等、色々頭使わないとだめですよね。移行する際の思考の切り替えインタフェースが決まっても、実際にどちらかからロジックを移行する際に「iOSだとアレだったけど、Androidはコレだったな」とインタフェースの実装の差に毎回少しずつ精神が削られていきます。単一のコールバックだったらまだしも、Aが終わったらBみたいな流れを実装するケースは存在します。そんなときもiOSとAndroidで実装方法違う+可読性低下により、段々泣きそうになります。思わず心の中で(Node.jsで実装してるんじゃねーんだよ...)と呟くぐらいに。何とかならないもんか?「全部1人で出来るもん」の人は全然苦にならないと思いますが、大体の開発はチームで行うのでそこらへんも兼ねて、何とかうまい事できないものかなぁと模索してたところ「そういえば前にそれっぽいライブラリをどこかで見たなぁ」と思い出し、記憶を遡ったところ今回のお題であるBolts(iOS/Android)に当たったわけです。Bolts?iOS/Android両対応のライブラリです。同じようなAPIで扱うことができます。Facebookに買収されたParseチームが作ったそうな。最新のFacebookiOSSDKなどでも使用されています。公式ページには既に「Swiftだとこう書くよ!」と暖かく新言語サポートもしてくれており期待出来ます!ではこれで何が出来るのか?jsのpromiseのような機能が使えるよ!アプリを構築する上で、様々な非同期処理を各々専用のライブラリを用いて実装すると思いますが、それらを全て、Boltsの提供するTaskというオブジェクトでラップします。インタフェースの統一など、まさに求めていたものを、統一的に、しかもiOS/Android間の差異を最小限に扱うことができます。それ以外にも機能はあるんですが、今回は使用しないので一旦無視します。非同期処理をBoltsを使用して整理するには、先に述べた通り、まず個別の非同期処理をTaskでラップします。具体的には、iOSではBFTask、AndroidではTask<TResult>をcreateし、実際の非同期処理(例えばHTTP通信など)を開始してから、Taskオブジェクトを返します。BFTask、Task<TResult>には処理の実行ステータスや処理結果、エラーなどを設定できるAPIがあるので、非同期処理の終了時にこれらを呼んでやります。結果やエラーのどちらかを設定することにより呼び出し元のcontinueWithXXX内部の処理がトリガーされる仕組みになっています。用意したTaskオブジェクトは、以下のように実行します。null;);の様に処理をつなげていきます。実際にiOSとAndroidのロジックをBotls対応にしてみます。Bolts導入前のiOS/Androidの非同期ロジックまずは、よくある非同期通信のロジックを、Boltsを使わずに書いてみます。内容は「都市名、国を引数で渡し、成功時には天気の結果をJSONで返し、失敗の場合はエラー情報を返す」です。通信部分に関してはiOSはAFNetworkingAndroidはVolleyを使用しています。NSLog(@"エラーになりました。OMVollyRequestはRequestを継承した独自クラスです。OMApplicationにはApplicationを継承した独自クラスで、メンバー変数にVolleyのRequestQueueを持っています。"エラーになりました。});まぁこれでも悪くはないんですが、先に書いた通りインタフェースが違うので移行するときに疲れます。続いてBoltsを使用したケースを見てみましょう。task.isCancelledでtaskのキャンセル判定も出来ます。NSLog(@"エラーになりました。"エラーになりました。});なんということでしょう、Boltsのお力添えによりインタフェースが統一され、可読性がアップしております。導入前に比べると色々考えることがなくなり、移行作業が楽になりますね。ルール決めをしっかりすれば、軽めのコンバーターを作って、コンバーターを実行するともう片方のソースに変換するぐらいのことは出来そうな感じしませんか?しますよね?そうすると移行コストが結構減る!->他の事に時間が使えるという幸せ連鎖が発動します。最後にということで、Boltsを触ってみましたがいかがでしたでしょうか?個人的には導入後の方が移行コストが格段に下がった感じがしたので現状のプロジェクトでも途中から導入し始めました。快く協力してくれた同じチームの何でも屋に感謝でございます。「continueWithXXX」って書くのが長いと感じており、iOSアプリだけでいい人はPromiseKitの方が記述量が減ると思います。参加してきました月別アーカイブスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。