1

我有更多的概念问题而不是基于代码的问题,因为我的代码有效。

当我的应用程序启动时,我从 coreData 获取 sessionObject 并验证 authToken。

此代码在我的加载控制器中有效。Fetch 请求有效并返回一个 sessionObjects 数组。但是,在我验证 authToken 的 App Delegate 中,返回的数组为空。为什么代码在控制器中有效,而在 App Delegate 中无效?提取请求没有错误。上下文不是零。这是我在加载控制器中使用的确切代码并且有效。

我是否必须在 App Delegate 中对 CoreData 执行不同的请求?我可以在 App Delegate 中使用获取请求吗?

应用程序 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 检查,结果都是真的。不知道为什么如果他们使用相同的上下文并存储他们不会返回相同的对象数组。

4

1 回答 1

1

看起来答案与我遇到的另一个问题有关。原来原始开发人员将核心数据堆栈添加到基本控制器中,我在应用程序委托中使用堆栈并将其传递给基本控制器。基本控制器会用自己的堆栈覆盖我的上下文,这就是为什么我无法在应用程序委托中获得预期的获取结果。

我会说从我在这个项目中学到的知识是在应用程序委托中创建上下文并将其传递给您的第一个控制器。然后在 prepareForSegue 或当您手动推送时传递上下文。同样在视图中会消失,您检查是否返回并更新商店上下文。如果您执行任何多线程,请确保在应用程序委托中您的上下文是 nsmainconcurrencytype,以便您可以为其他线程创建子上下文。这将保持数据结果符合预期并将冲突降至最低。

感谢您对此的所有意见。你的回答帮助我找到了这个愚蠢的问题。

于 2013-03-03T19:27:17.160 回答