我有更多的概念性问题,而不是基于代码,因为我的代码可以运行。
当我的应用程序启动时,我从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检查,两者都恢复正常。不确定为什么如果他们使用相同的上下文和存储,他们就不会返回相同的对象数组。
答案 0 :(得分:0)
看起来答案与我遇到的另一个问题有关。原来开发人员将核心数据堆栈添加到基本控制器中,我在app delegate中使用堆栈并将其传递给基本控制器。基本控制器将使用自己的堆栈覆盖我的上下文,这就是为什么我无法在app delegate中获得预期的获取结果。
我想从我在这个项目中学到的知识是在app delegate中创建上下文并将其传递给你的第一个控制器。然后在prepareForSegue或手动推送传递上下文时。此外,在视图中将消失,您检查是否返回并更新商店上下文。如果您执行任何多线程,请确保在app委托中您的上下文是nsmainconcurrencytype,以便您可以为其他线程创建子上下文。这将使数据结果保持预期并且冲突最小化。
感谢您的所有输入。您的回复帮助我找出了愚蠢的问题。