View
3.476
Download
7
Category
Preview:
DESCRIPTION
第47回Cocoa勉強会関西(2012/12/01)の発表資料です。
Citation preview
Core Data の概要とNSIncrementalStoreかねうちてつや
Cocoa勉強会関西 2012/12/01
自己紹介かねうちてつや @kaniza
フェンリル所属 http://www.fenrir-inc.com/
Sleipnir for Mac, Sleipnir Mobile for iPhone / iPad 等
好きなもの: Emacs, オブジェクト指向, ビール
嫌いなもの: Singleton
近況開発に復帰してそろそろ2ヶ月
バグの原因を特定してることが多い
Mac の開発がメイン
App Store 申請時に LAN が重くなる事態が発生
iPhone 4S の Wi-Fi が死亡
今日のお題Core Dataの概要
何がうれしいの?
構成ざっくり解説
ちょっと高度な話
Core Data の新しい機能: NSIncrementalStore
Core DataOS X / iOS のデータ管理フレームワーク
2005年 Mac OS X 10.4 Tiger とともに登場
2009年 iOS 3.0 に搭載
多くのアプリで採用される主要機能のひとつ
表には出ないながらも着実に機能強化されている
何をしてくれるのかデータ設計
設計したデータのセーブ・ロード
いわゆる永続化
実行中のデータ変更管理
UndoとかRedo
Core Data よく聞く声むずかしそう
よくわからん
遅い
速くない
Core Dataよく聞く声複雑なことを扱うので複雑なのはしょうがない
洗練された設計
機能が充実
自分で書くよりは速い
遅いのはチューニングできる
他の手法User Defaults
Property List
SQLite
XML, JSONなど
Core Data の長所大量のデータを扱える
バックエンドに SQLite を利用できる
かなり高度なことが比較的簡単にできる
データをオブジェクトとして扱える
Apple純正
AppKit や UIKit などと親和性が高い
Core Data の短所関連クラスが多く覚えることが多い
どうしてもチューニングできないところがある
OS X / iOS でしか動かない
とはいえ、Apple 純正
ぜひ活用したい
デモ
デモの中身都道府県+氏名のデータ5000件(ダミー)
特定の都道府県の氏名だけをアイウエオ順に表示
実機でも十分なパフォーマンス
表示時は20件ずつ取得
登場人物
Person X
Person Y
PrefX
PrefY
Person Z
コンテキスト
永続化ストア
アプリ
データモデル
FetchRequest
データモデルCore Data におけるデータ構造を表現したもの
NSManagedObjectModel クラス
データオブジェクトのインスタンスに対する「クラス」に近い概念
Person X
Person Y
PrefX
PrefY
Person Z
コンテキスト
永続化ストア
アプリ
データモデル
FetchRequest
マネージド・オブジェクトデータモデルにもとづくインスタンス
つまりアプリに関連するデータオブジェクト
1つのクラスで様々なデータモデルに対応
NSManagedObject → 管理されてるオブジェクト
生成、保存、メモリ管理などがCore Dataの管理下
アプリ側はあんまり管理しない
// NSManagedObject をそのまま使う場合NSManagedObject object = ....;NSString *name = [object valueForKey:@”name”];
// サブクラスを作れば...。必要ならロジックも実装可Person *person = ....;NSString *name = person.name;
NSManagedObject vs サブクラス
Person X
Person Y
PrefX
PrefY
Person Z
コンテキスト
永続化ストア
アプリ
データモデル
FetchRequest
永続化ストアマネージドオブジェクトを保存しておくところ
NSPersistentStoreとNSPersistentStoreCoordinatorの組合せで実現
Person X
Person Y
PrefX
PrefY
Person Z
コンテキスト
永続化ストア
アプリ
データモデル
FetchRequest
コンテキストマネージドオブジェクトが存在する場所
保存とか検索とかの操作対象となる
NSFetchRequest を通じてマネージド・オブジェクトを検索して取得
コード見てみる
NSFetchedResultsControlleriOS の Table View のデータソースに Core Data を使う時に便利なクラス
特定条件でのマネージド・オブジェクト取得・変更の監視などを効率的に実行
データの変更を簡単に Table View に反映できる
使い方がパターン化しており再利用性が高い
ちょっと高度な話
Core Data と並列処理コンテキストとその中のマネージド・オブジェクトは「生成したスレッド」でのみアクセスする
スレッドごとに複数のコンテキストを作って、保存時にマージできる
スレッド間でやりとりする場合は ObjectID を使う
Lion / iOS 5 以降は非同期処理対応が改善
最近困っていること某アプリでMac を起動後はじめての起動で、ある特定の fetch が恐ろしいほど遅い
数十秒以上かかるケースも
2回目以降は(アプリ再起動しても)速い
pread で刺さっている。バックグラウンドでも刺さってメインスレッドがほぼ止まる
NSIncrementalStore
NSIncrementalStoreNSPersistentStore の抽象サブクラス
SQLite や XML の代わりに使える
兄弟クラス: NSAtomicStore
CSVファイルなどをデータストアに使う
NSIncrementalStoreちょっとずつアクセスするストア
主に Web サービスを想定
Core Data のバックエンドに Web サービス!
Incremental Store Programming Guide を読むしか!
でも実質1ページしかない!よくわからん!!
でも注目している人はいる
http://sealedabstract.com/code/nsincrementalstore-the-future-of-web-services-in-ios-mac-os-x/
http://nshipster.com/nsincrementalstore/
AFIncrementalStore
AFIncrementalStoreAFNetworking ライブラリの拡張として提供
AFRESTClient のサブクラスを実装すれば HTTP ベースのウェブサービスを利用するNSIncrementalStoreが(ほぼ)完成!
SQLite も補助的なバックエンドとして使う
裏でもうひとつコンテキストを管理している
AFIncrementalStore
<AFIncrementalStoreHTTPClient>
AFRESTClient
AFHTTPClient
MyIncrementalStore MyRESTClient
MyRESTClient でやること
Fetch Request を HTTP Request に変換
レスポンスから対象となる配列を抽出
レスポンス内のデータをデータモデルのデータにマッピング
その他ごにょごにょ
Incremental Store のすすめIncremental Store は将来性のある機能
でもあんまり話題にはなっていない
定評ある AFNetworking 方面で実装が登場
次回勉強会テーマにピッタリ!
まとめCore Data は面倒だけど便利です
「マネージド」な快感がわかったら勝ち
Incremental Store 面白そうなのでおすすめです
pread で刺さって困ってる人いませんか?
Recommended