43
Core Data の概要と NSIncrementalStore かねうちてつや Cocoa 勉強会関西 2012/12/01

Core Data の概要と NSIncrementalStore

Embed Size (px)

DESCRIPTION

第47回Cocoa勉強会関西(2012/12/01)の発表資料です。

Citation preview

Page 1: Core Data の概要と NSIncrementalStore

Core Data の概要とNSIncrementalStoreかねうちてつや

Cocoa勉強会関西 2012/12/01

Page 2: Core Data の概要と NSIncrementalStore

自己紹介かねうちてつや @kaniza

フェンリル所属 http://www.fenrir-inc.com/

Sleipnir for Mac, Sleipnir Mobile for iPhone / iPad 等

好きなもの: Emacs, オブジェクト指向, ビール

嫌いなもの: Singleton

Page 3: Core Data の概要と NSIncrementalStore

近況開発に復帰してそろそろ2ヶ月

バグの原因を特定してることが多い

Mac の開発がメイン

App Store 申請時に LAN が重くなる事態が発生

iPhone 4S の Wi-Fi が死亡

Page 4: Core Data の概要と NSIncrementalStore

今日のお題Core Dataの概要

何がうれしいの?

構成ざっくり解説

ちょっと高度な話

Core Data の新しい機能: NSIncrementalStore

Page 5: Core Data の概要と NSIncrementalStore

Core DataOS X / iOS のデータ管理フレームワーク

2005年 Mac OS X 10.4 Tiger とともに登場

2009年 iOS 3.0 に搭載

多くのアプリで採用される主要機能のひとつ

表には出ないながらも着実に機能強化されている

Page 6: Core Data の概要と NSIncrementalStore

何をしてくれるのかデータ設計

設計したデータのセーブ・ロード

いわゆる永続化

実行中のデータ変更管理

UndoとかRedo

Page 7: Core Data の概要と NSIncrementalStore

Core Data よく聞く声むずかしそう

よくわからん

遅い

速くない

Page 8: Core Data の概要と NSIncrementalStore

Core Dataよく聞く声複雑なことを扱うので複雑なのはしょうがない

洗練された設計

機能が充実

自分で書くよりは速い

遅いのはチューニングできる

Page 9: Core Data の概要と NSIncrementalStore

他の手法User Defaults

Property List

SQLite

XML, JSONなど

Page 10: Core Data の概要と NSIncrementalStore

Core Data の長所大量のデータを扱える

バックエンドに SQLite を利用できる

かなり高度なことが比較的簡単にできる

データをオブジェクトとして扱える

Apple純正

AppKit や UIKit などと親和性が高い

Page 11: Core Data の概要と NSIncrementalStore

Core Data の短所関連クラスが多く覚えることが多い

どうしてもチューニングできないところがある

OS X / iOS でしか動かない

Page 12: Core Data の概要と NSIncrementalStore

とはいえ、Apple 純正

Page 13: Core Data の概要と NSIncrementalStore

ぜひ活用したい

Page 14: Core Data の概要と NSIncrementalStore

デモ

Page 15: Core Data の概要と NSIncrementalStore

デモの中身都道府県+氏名のデータ5000件(ダミー)

特定の都道府県の氏名だけをアイウエオ順に表示

実機でも十分なパフォーマンス

表示時は20件ずつ取得

Page 16: Core Data の概要と NSIncrementalStore

登場人物

Page 17: Core Data の概要と NSIncrementalStore

Person X

Person Y

PrefX

PrefY

Person Z

コンテキスト

永続化ストア

アプリ

データモデル

FetchRequest

Page 18: Core Data の概要と NSIncrementalStore

データモデルCore Data におけるデータ構造を表現したもの

NSManagedObjectModel クラス

データオブジェクトのインスタンスに対する「クラス」に近い概念

Page 19: Core Data の概要と NSIncrementalStore

Person X

Person Y

PrefX

PrefY

Person Z

コンテキスト

永続化ストア

アプリ

データモデル

FetchRequest

Page 20: Core Data の概要と NSIncrementalStore

マネージド・オブジェクトデータモデルにもとづくインスタンス

つまりアプリに関連するデータオブジェクト

1つのクラスで様々なデータモデルに対応

NSManagedObject → 管理されてるオブジェクト

生成、保存、メモリ管理などがCore Dataの管理下

アプリ側はあんまり管理しない

Page 21: Core Data の概要と NSIncrementalStore

//  NSManagedObject  をそのまま使う場合NSManagedObject  object  =  ....;NSString  *name  =  [object  valueForKey:@”name”];

//  サブクラスを作れば...。必要ならロジックも実装可Person  *person  =  ....;NSString  *name  =  person.name;

NSManagedObject vs サブクラス

Page 22: Core Data の概要と NSIncrementalStore

Person X

Person Y

PrefX

PrefY

Person Z

コンテキスト

永続化ストア

アプリ

データモデル

FetchRequest

Page 23: Core Data の概要と NSIncrementalStore

永続化ストアマネージドオブジェクトを保存しておくところ

NSPersistentStoreとNSPersistentStoreCoordinatorの組合せで実現

Page 24: Core Data の概要と NSIncrementalStore

Person X

Person Y

PrefX

PrefY

Person Z

コンテキスト

永続化ストア

アプリ

データモデル

FetchRequest

Page 25: Core Data の概要と NSIncrementalStore

コンテキストマネージドオブジェクトが存在する場所

保存とか検索とかの操作対象となる

NSFetchRequest を通じてマネージド・オブジェクトを検索して取得

Page 26: Core Data の概要と NSIncrementalStore
Page 27: Core Data の概要と NSIncrementalStore

コード見てみる

Page 28: Core Data の概要と NSIncrementalStore

NSFetchedResultsControlleriOS の Table View のデータソースに Core Data を使う時に便利なクラス

特定条件でのマネージド・オブジェクト取得・変更の監視などを効率的に実行

データの変更を簡単に Table View に反映できる

使い方がパターン化しており再利用性が高い

Page 29: Core Data の概要と NSIncrementalStore

ちょっと高度な話

Page 30: Core Data の概要と NSIncrementalStore

Core Data と並列処理コンテキストとその中のマネージド・オブジェクトは「生成したスレッド」でのみアクセスする

スレッドごとに複数のコンテキストを作って、保存時にマージできる

スレッド間でやりとりする場合は ObjectID を使う

Lion / iOS 5 以降は非同期処理対応が改善

Page 31: Core Data の概要と NSIncrementalStore

最近困っていること某アプリでMac を起動後はじめての起動で、ある特定の fetch が恐ろしいほど遅い

数十秒以上かかるケースも

2回目以降は(アプリ再起動しても)速い

pread で刺さっている。バックグラウンドでも刺さってメインスレッドがほぼ止まる

Page 32: Core Data の概要と NSIncrementalStore

NSIncrementalStore

Page 33: Core Data の概要と NSIncrementalStore

NSIncrementalStoreNSPersistentStore の抽象サブクラス

SQLite や XML の代わりに使える

兄弟クラス: NSAtomicStore

CSVファイルなどをデータストアに使う

Page 34: Core Data の概要と NSIncrementalStore

NSIncrementalStoreちょっとずつアクセスするストア

主に Web サービスを想定

Core Data のバックエンドに Web サービス!

Incremental Store Programming Guide を読むしか!

でも実質1ページしかない!よくわからん!!

Page 35: Core Data の概要と NSIncrementalStore

でも注目している人はいる

Page 38: Core Data の概要と NSIncrementalStore

AFIncrementalStore

Page 39: Core Data の概要と NSIncrementalStore

AFIncrementalStoreAFNetworking ライブラリの拡張として提供

AFRESTClient のサブクラスを実装すれば HTTP ベースのウェブサービスを利用するNSIncrementalStoreが(ほぼ)完成!

SQLite も補助的なバックエンドとして使う

裏でもうひとつコンテキストを管理している

Page 40: Core Data の概要と NSIncrementalStore

AFIncrementalStore

<AFIncrementalStoreHTTPClient>

AFRESTClient

AFHTTPClient

MyIncrementalStore MyRESTClient

Page 41: Core Data の概要と NSIncrementalStore

MyRESTClient でやること

Fetch Request を HTTP Request に変換

レスポンスから対象となる配列を抽出

レスポンス内のデータをデータモデルのデータにマッピング

その他ごにょごにょ

Page 42: Core Data の概要と NSIncrementalStore

Incremental Store のすすめIncremental Store は将来性のある機能

でもあんまり話題にはなっていない

定評ある AFNetworking 方面で実装が登場

次回勉強会テーマにピッタリ!

Page 43: Core Data の概要と NSIncrementalStore

まとめCore Data は面倒だけど便利です

「マネージド」な快感がわかったら勝ち

Incremental Store 面白そうなのでおすすめです

pread で刺さって困ってる人いませんか?