13
CoreDataをバックグラ ウンドで扱うためのTips 7iOS_LT 2014/03/05 山口洋平 1

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

Embed Size (px)

DESCRIPTION

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

Citation preview

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

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

第7回iOS_LT 2014/03/05 山口洋平

1

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

宣伝:コミュカメラ iOS アプリ 2/28 リリース!!

!2

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

CoreData おさらい• Apple純正の永続化フレームワーク

• データベース(SQLite, XML, plist, etc)

• 機能

• オブジェクトの問い合わせ、永続化

• バイナリデータ、NSArray とか突っ込めちゃう

• マイグレーション機能サポート

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

なぜバックグラウンド?

• UI操作を妨害することなく、CoreData でデータ処理をしたい→ バックグラウンドでデータ処理したい

• バックグラウンドでCoreData を扱った時にハマりがちな事例について紹介

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

Tips1: background で処理をさせたい

• やりたいこと

• background 用の dispatch_queue で context に問い合わせてデータを取得・更新

• NSFetchRequest: データベースに対するクエリー

5

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

Tips1: background で処理をさせたい NG

• デッドロックの危険性あり!

• NSManagedObjectContext は Thread-Safe ではない!

• あるスレッドで executeFetchRequest: の処理中に、また別のスレッドで executeFetchRequest: が呼ばれると、、

6

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

Tips1: background で処理をさせたい OK

• performBlock:

• context と紐付いた dispatch_queue に対して、ブロックを渡して処理を実行させる

• context に main queue か private queue のどちらかに紐付けるかは初期化時に設定

• 非同期呼び出し

• 処理が特定のスレッドでのみ実行されるのを保証してくれる→ ブロック内でのオブジェクトへのアクセスは Thread-Safe

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

Tips2: background で取得したデータをメインスレッドで受け取りたい

• やりたいこと

1. バックグラウンドでクエリを発行してデータ取得 (Tips1 復習)

2. 取得したデータをメインキューで受け取って、オブジェクトへアクセス

←1

←2

8

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

Tips2: background で取得したデータをメインスレッドで受け取りたい NG

• デッドロック!

• あるスレッドで取得したオブジェクトを別のスレッドに渡してはいけない!

• オブジェクトのプロパティ値を読み込もうとすると、contextがオブジェクトをロックする

9

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

Tips2: background で取得したデータをメインスレッドで受け取りたい OK

• 1. オブジェクトをそのまま渡すのではなく、オブジェクトのobjectIDをまず取得

• objectID: オブジェクトをユニークに特定するためのID

• objectID へのアクセスはオブジェクトの取得スレッドが異なっていてもOK

10

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

• 2. データを処理したいスレッドで、取得した objectID から再びオブジェクトを取得し直す

• - [NSManagedObject existingObjectWithID:]

• objectID からオブジェクトを取得する 11

Tips2: background で取得したデータをメインスレッドで受け取りたい OK

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

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

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

ご清聴ありがとうございました

13