FJCT_ニフクラ mobile backend(mBaaS)お役立ちブログ

スマホアプリ開発にニフクラ mobile backend(mBaaS)。アプリ開発に役立つ情報をおとどけ!

Hydraを使ってSwift SDKの非同期処理をasync/await化する

f:id:mbaasdevrel:20180806093819p:plain

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を活用しましょう。

中津川 篤司

中津川 篤司

NCMBエヴァンジェリスト。プログラマ、エンジニアとしていくつかの企業で働き、28歳のときに独立。 2004年、まだ情報が少なかったオープンソースソフトの技術ブログ「MOONGIFT」を開設し、毎日情報を発信している。2013年に法人化、ビジネスとエンジニアを結ぶDXエージェンシー「DevRel」活動をスタート。