CoreData获取请求返回空数组

时间:2013-02-12 19:19:21

标签: ios objective-c core-data

我有更多的概念性问题,而不是基于代码,因为我的代码可以运行。

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

此代码在我的加载控制器中有效。 Fetch请求起作用并返回一个sessionObjects数组。但是在App Delegate中,我验证了authToken,返回的数组为空。为什么代码在控制器中工作但在App Delegate中不起作用?获取请求没有错误。背景不是零。这是我在加载控制器中使用的确切代码,并且有效。

我是否必须以不同方式为App Delegate中的CoreData提出请求?我可以在App Delegate中使用获取请求吗?

app Delegate DidBecomeActive方法中的示例代码。我使用DidBecomeActive,因此我们可以从后台和init返回验证。

    // 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中生成的。

修改 我在App Delegate和Loading控制器中进行了isMainThread检查,两者都恢复正常。不确定为什么如果他们使用相同的上下文和存储,他们就不会返回相同的对象数组。

1 个答案:

答案 0 :(得分:0)

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

我想从我在这个项目中学到的知识是在app delegate中创建上下文并将其传递给你的第一个控制器。然后在prepareForSegue或手动推送传递上下文时。此外,在视图中将消失,您检查是否返回并更新商店上下文。如果您执行任何多线程,请确保在app委托中您的上下文是nsmainconcurrencytype,以便您可以为其他线程创建子上下文。这将使数据结果保持预期并且冲突最小化。

感谢您的所有输入。您的回复帮助我找出了愚蠢的问题。