mBaaSではネットワーク処理を多用しますので、処理全体が非同期化します。同期処理にすることもできますが、その場合UIが固まってしまうのでユーザ体験が悪くなってしまいます。
そこで使ってみたいのがPromise化、そしてasync/awaitを使った非同期処理です。今回はその代表的なライブラリであるHydraを使った方法を紹介します。そしてSDKは最近リリースされたSwift SDKを使います。
Hydraのインストール
HydraはCocoaPodsを使ってインストールしました。
pod 'HydraAsync'
Swift SDKのインストール
Swift SDKはXcodeプロジェクトを取得して追加しています。
Promise化する
今回はオブジェクトの保存処理をasync/awaitで扱えるようにします。そのために、まずはオブジェクトの保存処理をPromise化します。
func save(obj: NCMBObject) -> Promise<Void> { return Promise<Void>(in: .background, token: nil) { (resolve, reject, _) in obj.saveInBackground(callback: { res in switch res { case .success: resolve(Void()) case let .failure(error): reject(error) } }) } }
async/awaitで呼び出す
この作成したsaveメソッドをasyncの中で呼び出します。
// asyncで全体を囲む async({ _ -> Void in let object : NCMBObject = NCMBObject(className: "test") object["message"] = "Hello" // awaitで実行 try await(save(obj: object)) print(object.objectId) return }).catch(in: .background, {error in print(error) })
まとめ
async/awaitを使うことで、非同期処理全体の見通しが良くなります。非同期処理を繰り返すとコールバック地獄になってしまったり、Promiseによってthenが繰り返されて、変数のスコープ管理が難しくなります。
mBaaSの扱いを簡単にするためにも、Promiseとasync/awaitを活用しましょう。