1

私のコードは機能するので、コードベースよりも概念的な質問があります。

アプリが起動したら、coreData から sessionObject を取得し、authToken を検証します。

このコードは、読み込みコントローラーで機能します。Fetch リクエストが機能し、sessionObjects の配列を返します。ただし、authToken を検証する App Delegate では、返された配列は空です。コードがコントローラーでは機能するのに、App Delegate では機能しないのはなぜですか? フェッチ要求からのエラーはありません。コンテキストは nil ではありません。これは、ローディング コントローラーで使用する正確なコードであり、動作します。

アプリ デリゲートで CoreData に対して別の方法で要求を行う必要がありますか? App Delegate でフェッチ リクエストを使用できますか?

アプリのサンプル コード DidBecomeActive メソッドをデリゲートします。私は DidBecomeActive を使用して、バックグラウンドと初期化からの戻り時に検証できるようにします。

    // check for valid authtoken if present so the correct home screen will display
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"CurrentSession" inManagedObjectContext:[self managedObjectContext]];

[request setEntity:entity];
CurrentSession *sessionObj = nil;
NSError *cdError = nil;
if([self managedObjectContext] == nil){
    NSLog(@"context is nil");
}
NSArray *sessionArray = [[[self managedObjectContext] executeFetchRequest:request error:&cdError] mutableCopy];
if (sessionArray != nil && [sessionArray count]) {

    sessionObj = (CurrentSession *)[sessionArray lastObject];
            NSLog(@"Found session %@",sessionObj.authToken);
    if (![sessionObj.authToken isEqualToString:@""]) {
        [Solid_Utilities validateAuthToken:[self managedObjectContext]];
    }
} else {
    NSLog(@"NO SESSION FOUND");
}

編集 私の問題はスレッドに関連している可能性があると確信しています。ローディング コントローラーでは、個別のスレッドで多くのタスクを実行します。App Delegate はメイン スレッドで実行されると想定しています。ただし、ローディング コントローラーに提供するコンテキストはアプリ デリゲートで生成されます。

編集 App Delegate と Loading コントローラーで isMainThread チェックを行ったところ、両方とも true として返されました。同じコンテキストとストアを使用すると、同じオブジェクトの配列が返されない理由がわかりません。

4

1 に答える 1

1

答えは私が抱えていた別の問題に関連していたようです。元の開発者がコア データ スタックをベース コントローラーに追加し、アプリ デリゲートでスタックを使用してベース コントローラーに渡していたことがわかりました。ベース コントローラーはコンテキストを独自のスタックで上書きするため、アプリ デリゲートで期待されるフェッチ結果を取得できませんでした。

このプロジェクトで学んだことから、アプリ デリゲートでコンテキストを作成し、それを最初のコントローラーに渡すことができます。次に、prepareForSegue で、または手動でプッシュするときにコンテキストを渡します。また、ビューが消えて、戻ってストアのコンテキストを更新するかどうかを確認します。マルチスレッドを行う場合は、アプリデリゲートでコンテキストが nsmainconcurrencytype であることを確認して、他のスレッドの子コンテキストを作成できるようにします。これにより、データの結果が期待どおりに維持され、競合が最小限に抑えられます。

これに関するすべての入力に感謝します。あなたの回答は、愚かな問題を突き止めるのに役立ちました。

于 2013-03-03T19:27:17.160 に答える