Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

CoreDataをバックグラウンドで扱うためのTips

4,757 views

Published on

社内LTで使用した資料です。

Published in: Technology

CoreDataをバックグラウンドで扱うためのTips

  1. 1. CoreDataをバックグラ ウンドで扱うためのTips 第7回iOS_LT 2014/03/05 山口洋平 1
  2. 2. 宣伝:コミュカメラ iOS アプリ
 2/28 リリース!! !2
  3. 3. CoreData おさらい • Apple純正の永続化フレームワーク • • データベース(SQLite, XML, plist, etc) 機能 • オブジェクトの問い合わせ、永続化 • バイナリデータ、NSArray とか突っ込めちゃう • マイグレーション機能サポート
  4. 4. なぜバックグラウンド? • UI操作を妨害することなく、CoreData でデータ処 理をしたい
 → バックグラウンドでデータ処理したい • バックグラウンドでCoreData を扱った時にハマり がちな事例について紹介
  5. 5. Tips1: background で処理を させたい • やりたいこと • background 用の dispatch_queue で context に問い合わせてデー タを取得・更新 • NSFetchRequest: データベースに対するクエリー 5
  6. 6. Tips1: background で処理を させたい NG • デッドロックの危険性あり! • NSManagedObjectContext は Thread-Safe ではない! • あるスレッドで executeFetchRequest: の処理中に、また別のスレッド で executeFetchRequest: が呼ばれると、、 6
  7. 7. Tips1: background で処理を させたい OK • performBlock: • context と紐付いた dispatch_queue に対して、ブロックを渡して処理を実行させる • • • context に main queue か private queue のどちらかに紐付けるかは初期化時に設定 非同期呼び出し 処理が特定のスレッドでのみ実行されるのを保証してくれる
 → ブロック内でのオブジェクトへのアクセスは Thread-Safe
  8. 8. Tips2: background で取得した
 データをメインスレッドで受け取りたい ←1 ←2 • やりたいこと 1. バックグラウンドでクエリを発行してデータ取得 (Tips1 復習) 2. 取得したデータをメインキューで受け取って、オブジェクトへ アクセス 8
  9. 9. Tips2: background で取得した
 データをメインスレッドで受け取りたい NG • デッドロック! • あるスレッドで取得したオブジェクトを別のスレッドに渡してはいけない! • オブジェクトのプロパティ値を読み込もうとすると、contextがオブジェク トをロックする 9
  10. 10. Tips2: background で取得した
 データをメインスレッドで受け取りたい OK • 1. オブジェクトをそのまま渡すのではなく、オブジェクトのobjectIDをまず取得 • objectID: オブジェクトをユニークに特定するためのID • objectID へのアクセスはオブジェクトの取得スレッドが異なっていてもOK 10
  11. 11. Tips2: background で取得した
 データをメインスレッドで受け取りたい OK • 2. データを処理したいスレッドで、取得した objectID から再びオブ ジェクトを取得し直す • - [NSManagedObject existingObjectWithID:] • objectID からオブジェクトを取得する 11
  12. 12. Reference • CoreData 非同期データ処理
 http://www.slideshare.net/hedjirog/core-data-1413406 • CoreData Programming Guide:Concurrency with Core Data
 https://developer.apple.com/library/mac/documentation/ cocoa/Conceptual/CoreData/Articles/cdConcurrency.html • Adventures in Multithreaded Core Data
 http://www.slideshare.net/Inferis/adventures-inmultithreaded-core-data • WWDC2012: Core Data Best Practices
  13. 13. ご清聴ありがとうございました 13

×