【发布时间】:2013-06-07 09:00:37
【问题描述】:
AFAIK ManagedObjectContext 必须在创建它的同一线程中使用,否则它可能会因为锁定而被冻结。
我在尝试在主线程中创建executeFetchRequest:error: 时遇到锁定的情况,其中我的ManagedObjectContext 是首先创建的(我可以看到调用实际上出现在主线程中,因为我有一个崩溃应用程序尝试从后台恢复后报告 - “[APPNAME] 未能及时恢复”)。
这很奇怪。我不明白是什么锁定了我的 MOC(我可以在前面提到的崩溃报告中看到其他线程调用跟踪,并且其中没有像 CoreData 这样的东西),我真的很想知道可能导致这种情况的原因以及我该如何调试它。
顺便说一句,这种情况很少发生。在一些可能解决问题的更改之后,我不知道结果,直到它再次发生。这很令人沮丧。
谁能帮我解决这个问题?
更新:
这里有一些代码(虽然我真的怀疑它是否真的有助于理解这个问题)
- (NSArray *)existingIncomeInvites
{
NSFetchRequest * fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Profile"];
[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"connectionRequestDidReceive = YES"]];
return [self.dataModel.managedObjectContext executeFetchRequest:fetchRequest error:nil];
}
应用程序在最后一行冻结
这里还有一些其他的代码
- (NSManagedObjectContext *)managedObjectContext
{
if (![NSThread isMainThread])
{
LOG(@"Trying to get MOC on main thread!");
}
if (_managedObjectContext != nil) {
return _managedObjectContext;
}
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (coordinator != nil) {
_managedObjectContext = [[NSManagedObjectContext alloc] init];
[_managedObjectContext setPersistentStoreCoordinator:coordinator];
}
return _managedObjectContext;
}
- (void)showBadgeOnButton
{
NSArray *incomeInvites = [self.dataModel.profileManager existingIncomeInvites];
...
}
而showBadgeOnButton 是从我的- (void)viewWillAppear:(BOOL)animated 调用的
我最近更改的是这个 - @"connectionRequestDidReceive = YES" 以前是 @"connectionRequestDidReceive == YES",但我认为这不会有任何区别......
【问题讨论】:
-
我们能看到一些代码吗?你在哪里叫它?
-
@Dev2rights,我更新了我的问题。
-
当然,但我想看看你在哪里调用 executeFetchRequest:error: 好像这是在一个未加载 UI 的地方,例如它会导致挂起。
-
@Dev2rights,“未加载 UI”是什么意思?正如我在更新中提到的,所有这些调用堆栈都是从
- (void)viewWillAppear:(BOOL)animated调用的,所以我猜此时一切都已加载。 -
如果出现“无法及时恢复”,一般是因为您的
didFinishLaunchingWithOptions返回时间过长。
标签: ios objective-c core-data