AFAIKManagedObjectContext
必须在创建它的同一线程中使用,否则它可能会因为锁定而冻结。
我在尝试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”,但我认为这不会有任何区别......