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