0

Core Data の使用を必要とするアプリに取り組んでいますが、Xcode で Master-Detail、Utility、または Blank テンプレート以外を使用する場合、Core Data を手動で配置する必要があることに気付きます。

また、Core Data が適切に機能するためには、アプリを Navigation Controller にラップし、Core Data のコードを AppDelegate ファイルに含める必要があることにも気付きました。

これを回避する方法を知っている人はいますか、それとも本来あるべき方法ですか?

私の App Delegate は次のようになります。これらの 3 行は、ManagedObjectContext の最も重要な設定のようです!

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.

    UINavigationController *navController = (UINavigationController *)self.window.rootViewController;
    FBBetsViewController *controller = (FBBetsViewController *)navController.topViewController;
    controller.managedObjectContext = self.managedObjectContext;
4

2 に答える 2

3

これらのテンプレートにはコア データの設定が含まれていますが、必須ではありません。どのプロジェクトからでもコア データを使用できます。必要に応じて、空のアプリケーションからコードを取得して、プロジェクトで使用することができます。

生成されたコードを見ると、コア データ スタックの構築に使用される 3 つの主要コンポーネントの 3 つの「ゲッター」が表示されます。

managedObjectModel は、バンドルのモデル ファイルを使用してモデルを作成します。New-File で Xcode で簡単に作成し、Core Data Data Model を選択します。

persistStoreCoordinator はモデルと SQL ストアを使用します。

最後に、persistentStoreCoordinator を使用して managedObjectContext を作成します。必要に応じて、実際にそのスタックを 1 つのメソッドで構築できることに注意してください。これらの個々のアクセサーを持つ必要はありません...

あなたはこのようなことをすることができます...

- (NSManagedObjectContext*)setupCoreDataStack
{
    // Load the model description
    NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"APPNAME" withExtension:@"momd"];
    NSManagedObjectModel *model = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];

    // Prepare the persistent store coordinator - needs the model
    NSURL *documentsDirectory = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
    NSURL *storeURL = [applicationDocumentsDirectory URLByAppendingPathComponent:@"APPNAME.sqlite"];
    NSError *error = nil;
    NSPersistentStoreCoordinator *psc = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];
    if (![psc addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error])
    {
        // Handle the error !!!!!
        // exit the function
        return nil;
    }    

    // Create the managed object context.  This is what you will really
    // use in the rest of your program.
    NSManagedObjectContext *moc = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
    [moc setPersistentStoreCoordinator:psc];
    return moc;
}

そして今、あなたは他の人とほぼ同じスタックを持っています. 唯一の実際の違いは、ここでの MOC がメイン キューの同時実行タイプを使用していることです。これは、はるかに優れた代替手段です。

より優れたパフォーマンス モデルが必要な場合は、親モックを挿入します。

実際、現在のコア データ戦略に慣れていない場合は、UIManagedDocument をお勧めします。

于 2012-05-03T01:22:04.557 に答える
2

Core Data は、ナビゲーション コントローラーを使用することも、AppDelegate で設定することも強制しません。起動時にセットアップを AppDelegate に配置するのが通例ですが、実際には、初期化が 1 回だけであることを確認する限り、どこにでも移動できます。

于 2012-05-02T19:57:38.253 に答える