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

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

Swiftで同期、非同期によるデータ保存

f:id:mbaasdevrel:20180806093819p:plain

Swiftではデータストアやファイルストアへのアクセス時に同期、非同期のどちらかを選べます。それぞれ実装方法や挙動が異なりますので注意してください。

同期処理

同期処理はネストが深くならないので、コードが見通しよく書けるのが特徴です。

var error : NSError?
file.save(&error)
if error != nil {
  // アップロード失敗
  print(error ?? "")
} else {
  // アップロード成功
}

例えば以下のようにも書けますが、これはエラーメッセージを受け取っていないだけで、同期処理なのは変わりません。

file.save(nil)

非同期処理

非同期処理の場合、メソッド名として saveInBackground を指定します。以下はその例です。

file.saveInBackground({(error) in
    if error != nil {
        // 保存失敗時の処理
        print(error ?? "")
    } else {
        // 保存成功時の処理
        print(NSDate(), "アップロード完了")
    }
}, progressBlock: {(int: Int32) in
    print(int)
});
print(NSDate(), "アップロード開始")

この場合、まずアップロード開始というメッセージが表示されます。その後アップロード完了というメッセージが表示されます。

同期中の動作について

同期処理で実装した場合、アップロードが完了するまで(または失敗するまで)画面が固まった状態になってしまいます。UXとしていいものではありませんので、非同期処理の方が安全と言えます。特にファイルストアのようなサイズの大きいネットワーク処理を行う場合には注意しなければなりません。

非同期処理を続けるとコールバック地獄になりますので、malcommac/HydraやPromise風に扱えるライブラリを使うのが良いでしょう。

中津川 篤司

中津川 篤司

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