Your SlideShare is downloading. ×
0
CoreData 非同期データ処理
CoreData 非同期データ処理
CoreData 非同期データ処理
CoreData 非同期データ処理
CoreData 非同期データ処理
CoreData 非同期データ処理
CoreData 非同期データ処理
CoreData 非同期データ処理
CoreData 非同期データ処理
CoreData 非同期データ処理
CoreData 非同期データ処理
CoreData 非同期データ処理
CoreData 非同期データ処理
CoreData 非同期データ処理
CoreData 非同期データ処理
CoreData 非同期データ処理
CoreData 非同期データ処理
CoreData 非同期データ処理
CoreData 非同期データ処理
CoreData 非同期データ処理
CoreData 非同期データ処理
CoreData 非同期データ処理
CoreData 非同期データ処理
CoreData 非同期データ処理
CoreData 非同期データ処理
CoreData 非同期データ処理
CoreData 非同期データ処理
CoreData 非同期データ処理
CoreData 非同期データ処理
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

CoreData 非同期データ処理

14,930

Published on

Published in: Technology
0 Comments
36 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
14,930
On Slideshare
0
From Embeds
0
Number of Embeds
12
Actions
Shares
0
Downloads
55
Comments
0
Likes
36
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. 永島 次朗 / Jiro NagashimaTwitter@hedjirognana music, inc. / iOS Engineerhttp://nana-music.com
  • 2. GoalUI操作を妨害することなく高度なデータ処理をしたい
  • 3. Goal UI操作を妨害することなく 高度なデータ処理をしたい 解決策• CoreDataをマルチスレッドで扱う手法が有効 • 複数のContext • parentContext(iOS5 以上) • performBlock: メソッド(iOS5 以上)
  • 4. Agenda• CoreDataフレームワークの概要• CoreDataとマルチスレッド • 単一/複数Contextによる設計 • CoreDataの便利機能 • parentContext(iOS5 以上) • performBlock: メソッド(iOS5 以上)
  • 5. CoreDataフレームワークの概要
  • 6. Demo
  • 7. CoreDataフレームワークの概要• 4つのクラスとクラス間の関係 ManagedObject ManagedObject ManagedObject ManagedObjectContext PersistentStoreCoordinator FetchedResultsController
  • 8. CoreDataフレームワークの概要 ManagedObject• データを表わすオブジェクト
  • 9. CoreDataフレームワークの概要 ManagedObject ManagedObject ManagedObject ManagedObjectContext• オブジェクトの集合を管理• オブジェクトの挿入/更新/削除
  • 10. CoreDataフレームワークの概要 ManagedObject ManagedObject ManagedObject PersistentStore ManagedObjectContext PersistentStoreCoordinator• オブジェクトの永続化• 永続ストアへマッピング
  • 11. CoreDataフレームワークの概要 ManagedObject ManagedObject ManagedObject ManagedObjectContext PersistentStoreCoordinator TableView FetchedResultsController• オブジェクトの変更を監視• TableViewの表示と整合性を保つ
  • 12. CoreDataとマルチスレッド
  • 13. 単一Contextによる設計• 新規オブジェクト追加時 ManagedObject ManagedObjectContext PersistentStoreCoordinator 通知のタイミング 1. 空のオブジェクト追加時 FetchedResultsController 2. オブジェクト更新時 問題点• 過剰な通知 • オブジェクトの更新後のみ通知したい
  • 14. 単一Contextによる設計 • オブジェクト永続化時 2. 永続化の ManagedObject 所要時間が増加 ManagedObjectContext PersistentStoreCoordinator1. 負荷の高い更新処理 FetchedResultsController 問題点 • 永続化に処理時間を要するとUI操作を妨害
  • 15. 単一Contextによる設計• 過度な通知が発生する可能性• 永続化時に処理時間を要してUIを妨害する可能性 複数のContextを作成
  • 16. 複数Contextによる設計Main Thread ManagedObject ManagedObjectContext PersistentStoreCoordinatorBackground FetchedResultsController ManagedObject ManagedObjectContext• スレッド毎にContextを作成 • メインスレッド:監視対象、永続化向け • バックグラウンド:(オブジェクトの)更新向け
  • 17. 複数Contextによる設計 Main Thread ManagedObject ManagedObjectContext PersistentStoreCoordinatorオブジェクト更新後にマージ Background 適切なタイミングで通知 FetchedResultsController ManagedObject ManagedObjectContext • 適切なタイミングで通知が可能 • Context(スレッド)毎に役割分担 • 処理負荷の分散
  • 18. CoreDataの便利機能• parentContext(iOS5 以上) • Context間での更新内容のマージが容易に• performBlock: メソッド(iOS5 以上) • 非同期処理の記述が容易に
  • 19. parentContextMain Thread ManagedObjectContext 親Context PersistentStoreCoordinator Parent 子ContextBackground FetchedResultsController ManagedObjectContext• 複数のContext間で親子関係を定義できる • setParentContext: メソッドで親Contextを指定
  • 20. parentContext Main Thread ManagedObjectContext 親Context PersistentStoreCoordinator Parentオブジェクト更新後にマージ 子Context Background FetchedResultsController ManagedObjectContext • Context間での更新内容のマージが容易に • 子Contextのsave: メソッド呼び出しでマージ
  • 21. parentContext• 親Contextの作成 Main Thread ManagedObjectContext 親Context Contextの更新処理を行なうスレッドが決定 NSMangedObjectContext *parentContext; parentContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType]; [parentContext setPersistentStoreCoordinator:_persistentStoreCoordinator];
  • 22. parentContext• 子Contextの作成 Main Thread Background Parent ManagedObjectContext ManagedObjectContext 親Context 子Context Contextの更新処理を行なうスレッドが決定 NSMangedObjectContext *childContext; childContex = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType]; [childContext setParentContext:parentContext]; 親Contextの指定
  • 23. performBlock:• 非同期処理の記述が容易に Main Thread Background Parent ManagedObjectContext ManagedObjectContext 親Context 子Context[childContext performBlock:^{ 非同期で処理が実行される // push to parent NSError *error; if (![childContext save:&error]) { // handle error }  [parentContext performBlock:^{ 非同期で処理が実行される NSError *error; if (![parentContext save:&error]) { // handle error } }];}];
  • 24. performBlock:• parentContextとの組み合わせ Main Thread Background Parent ManagedObjectContext ManagedObjectContext 親Context 子Context[childContext performBlock:^{ // push to parent NSError *error; if (![childContext save:&error]) { // handle error } 親Contextへ変更内容をマージ  [parentContext performBlock:^{ NSError *error; if (![parentContext save:&error]) { // handle error } }];}];
  • 25. performBlock:• parentContextとの組み合わせ Main Thread Background Parent ManagedObjectContext ManagedObjectContext 親Context 子Context[childContext performBlock:^{ // push to parent NSError *error; if (![childContext save:&error]) { // handle error }  [parentContext performBlock:^{ NSError *error; if (![parentContext save:&error]) { // handle error } 親Contextの永続化 }];}];
  • 26. まとめ• UI操作を妨害しない高度なデータ処理• CoreDataをマルチスレッドで利用する • 複数のContextを用意 • parentContext で親子関係を定義 • performBlock: メソッドで非同期処理
  • 27. 参考資料• Multi-Context CoreData http://www.cocoanetics.com/2012/07/multi-context-coredata/
  • 28. より詳しい情報• WWDC 2011 • Session 303 - Whats New in Core Data on iOS • Session 315 - Whats New in Core Data on Mac OS X• WWDC 2012 • Session 214 - Core Data Best Practices

×