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];
}
app冻结在最后一行
这里有一些其他代码
- (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”,但我认为这不会有任何区别......
答案 0 :(得分:0)
我自己找到了答案。 显然我以非常不明显的方式使用persistentStoreCoordinator - 访问故障中的数据。我甚至不知道我的托管对象实际上是故障。我在后台线程中进行了访问。所以这就是让我痛苦的事情。
希望这会对某人有所帮助。