cocoaのモデルデータ関連技術のメモ
指先を怪我したのでバンドエイドを貼ったら、trackPadが反応してくれない。モチベーションが落ちる。
ローカルへの保存方法
cocoaアプリのファイルの保存形式では大別して以下の4つがある。
保存形式 | 大量データ | 複雑なデータ | その他 | |
---|---|---|---|---|
手書き | 気合い | 気合い | 気合い | |
NSKeyedArchiver | 非公開 | r/wに時間がかかる | 重複処理あり | |
CoreData | 非公開 | 一部だけ読み出せる | 重複処理あり | undo/redoサポート |
plist | 公開 | r/wに時間がかかる | 重複処理なし |
この表だけを見ると、お手軽さや機能を考えればCoreData一択。
model-viewの同期方法
Cocoaアプリのモデルとviewの同期方法には主に以下の4つがある。
依存性 | code or nib | その他 | |
---|---|---|---|
手書き | コード | ||
cocoa binding | iOSで使えない | nib | |
fetchResultController | CoreData前提 | コード | coreDataがiCloudStorageと相性が悪い |
KVOとaction | コード |
CoreDataを使う場合は、FetchResultControllerとKVOを使って書くのがよさげ。 CoreDataを使わない場合は、ButtonなどはKVOで書いて、TableViewはデリゲートを使った手書きになりそう。
データの保存と違って、手法の混在できるので、適材適所で行うのが良い。
デバイス間のドキュメントの同期方法
調べている途中で気がついたのですが、CoreData Storage 又はCoreData in iCloudと呼ばれる技術はDeprecatedになりました。 CoreDataを使って、iCloud経由でドキュメントを同期できる夢の技術だったのですが、致命的なバグでもあったのでしょう。
で、デバイス間のドキュメント同期技術は以下の2つです。
- iCloud document storage
file単位に基づく同期。DropBoxのApple版といった所。PowerPointやWordのようなタイプの書類ベースのアプリとは相性が良いかもしれない。
変更部分だけのマージが出来ないので、巨大なバイナルファイルを丸ごと入れ替えになる。
- CloudKit storage
クラウドにデータを置くことが主眼。グラウドにあるデータが主となる。JSからの呼び出しをサポートしているので、webアプリを作る場合は必須。
ネットに繋がっていないと使えない欠点がある。FileMakerやEverNoteのようなパーソナルデータベース型のアプリとは相性が良いかもしれない。
ローカルキャッシュをCoreDataに、ネットに繋がっている時にCloudKitで同期を行うと、上記の欠点を解消できる。
デバイス間の操作状態同期方法
同じユーザーアカウントの別デバイスに操作状態を引き継げる。
NSUserActivityを設定するらしい。使ったことないけど。
NSOrderedSetの感想
NSOrderedSetが使えそうで使えない。
CoreDataでは、NSOrderedSetをサポートしている。しかし、NSArrayControllerがOrdersSetに対応していない。
bindingでNSTablbeViewの中に順列を使うには、NSSet & NSSortOrderの組み合わせで表現する必要がある。
bindingでなくNSFetchResultControllerを使用しても良い。
CoreData中のNSOrderedSetはCoreDataの思想とあまり相性が良くないのかもしれない。
bindingでのサポートだけでなく、CoreDataInCloudでもサポートが無かった。
地雷を踏み抜かないように、SortOrderを使った昔ながらの手法を使用した方が良い。