0

Restサービスを取得して情報をコアデータに入れたい脳のクラスがあります(RestKitオブジェクトマッピングを見てきましたが、まだ完全には理解しておらず、よりシンプルにしたいと思っています)。クラスにCoreDataの知識が必要ですがengine、ベースをカバーするために、タブバーコントローラーのすべてのVCにManagedObjectContextを追加します(アプリデリゲートの場合)。

UITabBarController *tabBar = (UITabBarController *)self.window.rootViewController;

NSArray *viewControllers = [tabBar viewControllers];

NSManagedObjectContext *context = self.managedObjectContext;
self.engine.managedObjectContext = context;
for (id viewController in viewControllers) {
    [viewController setManagedObjectContext:context];
}

tabBar.selectedIndex = 2;

return YES;

engineただし、クラスでcoreDataが使用可能かどうかを確認しようとすると、このエラーがログに記録されます。

        if (self.managedObjectContext == NULL || [self.managedObjectContext isEqual:[NSNull null]]) {
            NSLog(@"Error");
        }

私は何が間違っているのですか?コアデータを非viewControllerクラスに正しく渡すにはどうすればよいですか?

編集:IFステートメントの直前、これはデバッガーで:

(lldb) po self.managedObjectContext
(NSManagedObjectContext *) $1 = 0x00000000 <nil>
(lldb) 
4

1 に答える 1

1

他のすべてのViewControllerの'context'プロパティが強力であると仮定すると、答えは、割り当てに行くときに、まだ作成されていないということです。これを試して:

NSManagedObjectContext *context = self.managedObjectContext;
assert(context); // or NSLog context
self.engine.managedObjectContext = context;

コンテキストのすべてのユーザーは同じスレッドにいる方がよいことに注意してください(コードではメインスレッドを想定しています)。

とは言うものの、より良い解決策は、辞書または配列を関係者に「提供」するための競合を管理し、すべてのコンテキストアクセスを1つのファイル(またはクラス)に保持するクラスの場合です。これにより、将来のデバッガーが非常に簡単になります(IMHO)>

編集:問題が、投稿した元のコードに値が設定されていることである場合-これはappDelegateであり、managedObjectContextは強力なプロパティであると想定し、設定操作をログに記録します。

for (id viewController in viewControllers) {
    [viewController setManagedObjectContext:context];
    NSLog(@"Just set context=%@ in %@", viewController, [viewController managedObjectContext]);
}

次に、各viewControllerのviewDidLoadに次の行を追加します。

NSLog(@"ViewController %@ context=%@", self, self.managedObjectContext);

これらのいずれかが当てはまることがわかります。

1)3つのviewControllerにmocを設定しましたが、他の場所でviewControllerを設定し、mocを設定しませんでした(他のコード)

2)MOCを設定しようとするとviewControllersがnilになります(論理エラー)

3)MOCを設定したViewControllerと、提案したメッセージをログに記録するViewControllerは同じですが、VCがログメッセージを出力するとき、MOCはnilです。この場合、VC内の何かがMOCをnilにリセットしています-おそらくviewDidLoadにあります。

于 2012-08-27T13:06:10.890 に答える