私のコードは機能するので、コードベースよりも概念的な質問があります。
アプリが起動したら、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 として返されました。同じコンテキストとストアを使用すると、同じオブジェクトの配列が返されない理由がわかりません。