2

アプリケーションで CoreData を使用しています。CoreData とその生成されたモデル オブジェクトを直接使用する代わりに、消費者が API を使用できるように、すべての CoreData 関連のものを API として抽象化したいと考えています。CoreData は、次のようにマネージド オブジェクト モデルを生成します。

@interface Person : NSManagedObject

@end

MyAPI などの API を定義したいのですが、次のような関数があります。

createPerson:(Person*)p;

したがって、この createPerson API のコンシューマーは、Person データ オブジェクト (Java の世界の POJO など) を作成し、この API を呼び出す必要があります。しかし、私は Person オブジェクトを作成できません

Person *p = [Person alloc] init]

CoreData によって作成されたこの Person モデルの指定された初期化子は、このタイプの作成を許可しないためです。

したがって、対応するユーザー向けデータ オブジェクトを PersonDO である可能性があると定義する必要があります。この API は、データを API 実装に運ぶ代わりにそれを使用する必要がありますか?

私のアプローチは正しいですか?このようにAPIを設計することが良い設計パターンであるかどうか、専門家のアドバイスはありますか?

4

2 に答える 2

2

Managed Object Context を扱わずに CoreData を使用することはできません。コンテキストから人を取得し、コンテキストに保存する必要があります。顧客にそれを処理させたくない場合、およびアプリで別のスレッドを使用しない場合は、appdelegate の管理対象オブジェクト コンテキストを呼び出す API を作成できます。ユーザーが行う必要があるのは、そのメソッドを呼び出す。

たとえば、Core Data メソッドによって自動生成されたものを使用して、API を次のようにすることができます。

+ (Person *)newPersonWithAttributes:(NSDictionary *)userInfo {

    // Call the designated initializer, but customer
    // doesn't need to think about managed object context
    return [Person initPesonWithAttributes:userInfo 
                    inManagedObjectContext:[[AppDelegate sharedAppDelegate] managedObjectContext]];
}
于 2012-04-14T05:54:10.957 に答える
1

それを抽象化するには、たくさんのものが必要です。RestKit はそれを行うメカニズムを提供します。軽量化は InnerBand になります (チュートリアルInnerBand CoreDataを参照) - ただし、マルチスレッドのスレッド/キューを自動的に決定するわけではありません。

ただし、これは非常に単純な API であり、必要なもののほとんどを提供する必要があります。

于 2012-04-14T07:00:20.693 に答える