Core Data iPhoneアプリのデザインパターン
-
06-07-2019 - |
質問
コアデータモデルを使用するアプリを構築しています。私はObjective Cにかなり慣れており、私の通常のデザインパターンはCore DataとObjective Cには実際には適用されません。少なくとも、それらを確認する例は見当たりません。
Apple Developerの例とintertubesのさまざまなソースを確認しました。
Core Dataを活用するには、各viewControllerにmanagedObjectContextを渡し、viewControllerにNSFetchedResultsControllerDelegateを実装し、フェッチを実行するための各メソッドを実装してから実装する必要があるようです
NSFetchedResultsChangeInsert
NSFetchedResultsChangeDelete NSFetchedResultsChangeMove NSFetchedResultsChangeUpdate
これにより、各viewControllerに約100行以上のコードが追加され、何度も何度も記述したコードと同じ90%のコードになります。さらに、すべてを渡し、メモリのフットプリントを追跡する必要があります。
他の言語では、要求に応じてデータを維持および配信するためのメソッドを保持するいくつかのクラスのシングルトンモデルを構築し、どこからでも利用できます。 Objective Cではそのアプローチを取ることができないようです。managedObjectContextを受け取り、必要なものを返す静的クラスをどこで構築するかは、すべてのビューにmanagedObjectContextを渡す必要があり、そうではありません結果の準備ができたときに呼び出されるデリゲートメソッドを実装するときのように非同期に。
これが理にかなっており、他の合理的な方法がないことを誰かが確認できるか、これを良い方法でまとめる方向に私を導くのを助けることを願っています。
ありがとう:)
解決
コアデータは、説明したほど複雑ではありません。
通常、iPhoneアプリには「メイン」があります。管理対象オブジェクトのコンテキスト。通常はアプリのデリゲートが所有します。アプリのデリゲート(ヒント: [[UIApplication sharedApplication]デリゲート]
)を取得できる限り、管理オブジェクトコンテキストにアクセスできます。静的なグローバル変数を定義して、アプリのデリゲートへの参照を保持し、作業を楽にします。
通常、 NSFetchedResultsController
インスタンスと UITableView
インスタンスの間には1対1の対応があります。テーブルビューの入力以外に、 NSFetchedResultsController
が必要になることは非常にまれです。同様のビューが多数ある場合(たとえば、iPodアプリとは異なる方法で同じデータを表示できるタブバー)、 NSFetchedResultsController
そして、そこから特定のView Controllerを導き出します。
現在、View Controllerを作成してオブジェクトを編集する場合、一般的に別の管理対象オブジェクトのコンテキストで行うことをお勧めします。ユーザーがキャンセルした場合、コンテキストを破棄するだけで変更はなくなります。繰り返しますが、これらのビューは単一のオブジェクトにのみ関係するため、 NSFetchedResultsController
は実際には必要ありません。
編集が完了したら、管理対象オブジェクトコンテキストを save:
します。他の管理対象オブジェクトコンテキストを管理するオブジェクトは、 NSFetchedResultsControllerDelegate
メソッドを実装して、テーブルビューの同期を維持する必要があります。繰り返しますが、これは基本クラスに実装できるため、この機能を関連するView Controllerに一般化できます。
他のヒント
CoreDataモデルを絶対に使用する必要がありますか、それともNSCoder(NSArchiver、NSKeyedArchiverなど)を使用するものが機能しますか? CoreDataはほとんどのアプリケーションにとって過剰であることがわかりました。
また、シングルトンを使用してアプローチできない理由を明確にできますか?私は多くのアプリケーションでシングルトン工場を問題なく使用しました。共有(シングルトン)インスタンスで動作するクラスレベルのメソッドを定義するのはかなり簡単です。