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つです。

  1. iCloud document storage

file単位に基づく同期。DropBoxのApple版といった所。PowerPointやWordのようなタイプの書類ベースのアプリとは相性が良いかもしれない。

変更部分だけのマージが出来ないので、巨大なバイナルファイルを丸ごと入れ替えになる。

  1. CloudKit storage

クラウドにデータを置くことが主眼。グラウドにあるデータが主となる。JSからの呼び出しをサポートしているので、webアプリを作る場合は必須。

ネットに繋がっていないと使えない欠点がある。FileMakerやEverNoteのようなパーソナルデータベース型のアプリとは相性が良いかもしれない。

ローカルキャッシュをCoreDataに、ネットに繋がっている時にCloudKitで同期を行うと、上記の欠点を解消できる。

デバイス間の操作状態同期方法

同じユーザーアカウントの別デバイスに操作状態を引き継げる。

NSUserActivityを設定するらしい。使ったことないけど。

https://developer.apple.com/jp/documentation/UserExperience/Conceptual/Handoff/HandoffFundamentals/HandoffFundamentals.html

NSOrderedSetの感想

NSOrderedSetが使えそうで使えない。

CoreDataでは、NSOrderedSetをサポートしている。しかし、NSArrayControllerがOrdersSetに対応していない。

bindingでNSTablbeViewの中に順列を使うには、NSSet & NSSortOrderの組み合わせで表現する必要がある。

bindingでなくNSFetchResultControllerを使用しても良い。

CoreData中のNSOrderedSetはCoreDataの思想とあまり相性が良くないのかもしれない。

bindingでのサポートだけでなく、CoreDataInCloudでもサポートが無かった。

地雷を踏み抜かないように、SortOrderを使った昔ながらの手法を使用した方が良い。