0

Apple に従って、App Delegate でコア データ スタックを作成し、managedObjectContext を最初のコントローラーに渡し、そこから 2 番目のコントローラーに渡します。

バックグラウンド スレッドで作業をしようとしていて、PrivateConcurrency 型を使用したいのですが、親が Main または Private でなければならないというエラーが表示されます。

アプリデリゲートでコンテキストを作成します

- (NSManagedObjectContext *)managedObjectContext
{
    if (_managedObjectContext != nil) {
        return _managedObjectContext;
    }

    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
    if (coordinator != nil) {
        _managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
        [_managedObjectContext setPersistentStoreCoordinator:coordinator];
    }
    return _managedObjectContext;
}

次に、それを最初のコントローラーに渡します

UINavigationController *navigationController = (UINavigationController *)self.window.rootViewController;
Paperwoven_LoadingViewController *firstController = (Paperwoven_LoadingViewController *)navigationController.topViewController;
[firstController setManagedObjectContext:[self managedObjectContext]];
NSLog(@"concurrency type is %@", [self managedObjectContext]);
NSLog(@"concurrency type is %u",firstController.managedObjectContext.concurrencyType);

セルフから同時実行タイプをログアウトすると、メインである 2 が得られることがわかります。しかし、最初のコントローラーに送信したばかりのコンテキストを確認すると、0 が返されます。正しく渡されないのはなぜですか?

編集

さらに、経由で managedObjectContext を取得AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate]でき、同時実行タイプが MAIN であることを確認できますが、次の行self.managedObjectContext = appDelegate.managedObjectContextで self.managedObjectContext の同時実行タイプを確認すると、それは 0 です。App デリゲートからコントローラーに割り当てると、同時実行タイプが失われるようです.

4

2 に答える 2

1

あなたのコードから、最も可能性の高い説明firstControllerは nil です。次の行を使用して取得します。

Paperwoven_LoadingViewController *firstController = (Paperwoven_LoadingViewController *)navigationController.topViewController;

しかし、topViewControllernil の場合firstViewControllerは nil です。次の行で:

[firstController setManagedObjectContext:[self managedObjectContext]];
NSLog(@"concurrency type is %@", [self managedObjectContext]);
NSLog(@"concurrency type is %u",firstController.managedObjectContext.concurrencyType);

Objective-C では、nil にメッセージを送信してもエラーにはならないため、最初の行はノーオペレーションです。上記の最後の行では、 を出力していますがnil.managedObjectContext.concurrencyType、これは 0 になります。

これは Core Data の問題ではなく、View Controller を構成する際の問題に似ています。

于 2013-03-01T01:24:07.643 に答える
0

私はばかです、ちょっと。別の開発者は、すべてのコントローラーが持つ同じコア データ スタック メソッドを Base コントローラーに配置しました。コントローラーのコンテキストを設定できましたが、ベースコントローラーが独自のコンテキストを作成し、渡されたコンテキストを上書きしました。このガベージコードを削除すると、問題が修正されました。これで私の質問に答えますので、これで締めくくります。反対票を投じないでください。私たちは皆、脳のおならをコーディングしています。

于 2013-03-01T20:13:14.160 に答える