Core Data の概要と NSIncrementalStore

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ページしかない!よくわからん!!

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

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