Ios executeFetchRequest:错误:在主线程上冻结
AFAIKIos executeFetchRequest:错误:在主线程上冻结,ios,objective-c,core-data,Ios,Objective C,Core Data,AFAIKManagedObjectContext必须在创建它的同一线程中使用,否则它可能会因为锁定而被冻结 当我尝试在主线程中执行executeFetchRequest:error:时,我遇到了锁定的情况,在主线程中,我的ManagedObjectContext首先被创建(我可以看到调用实际上出现在主线程中,因为我在应用程序尝试从后台恢复后有一个崩溃报告-“[APPNAME]未能及时恢复”) 真奇怪。我不明白是什么锁定了我的MOC(我可以在前面提到的崩溃报告中看到其他线程调用跟踪,它们中没有类
ManagedObjectContext
必须在创建它的同一线程中使用,否则它可能会因为锁定而被冻结
当我尝试在主线程中执行executeFetchRequest:error:
时,我遇到了锁定的情况,在主线程中,我的ManagedObjectContext
首先被创建(我可以看到调用实际上出现在主线程中,因为我在应用程序尝试从后台恢复后有一个崩溃报告-“[APPNAME]未能及时恢复”)
真奇怪。我不明白是什么锁定了我的MOC(我可以在前面提到的崩溃报告中看到其他线程调用跟踪,它们中没有类似的CoreData
),我真的想知道这可能是什么原因,以及如何调试它
顺便说一下,这种情况很少发生。在一些可能解决问题的改变之后,我不知道结果,直到它再次发生。这太令人沮丧了
有人能帮我解决这个问题吗
更新:
下面是一些代码(尽管我真的怀疑它是否有助于理解这个问题)
应用程序在最后一行冻结
下面是一些其他代码
- (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];
...
}
并且从我的-(void)视图调用showBadgeOnButton
,将显示:(BOOL)动画
我最近改变的是-@“connectionRequestDidReceive=YES”之前是“connectionRequestDidReceive==YES”,但我认为这不会有任何区别…我自己找到了答案。 显然,我使用persistentStoreCoordinator的方式并不明显——在故障中访问数据。我甚至不知道我的管理目标实际上是错误的。我在后台线程中进行了访问。这就是让我如此痛苦的原因
希望这会对某人有所帮助。我们能看一些代码吗?你在哪里调用它?@Dev2rights,我更新了我的问题。当然,但我试图看看你在哪里调用executeFetchRequest:error:好像这是在UI未加载的地方,例如,它会导致挂起。@Dev2rights,“UI未加载”是什么意思?正如我在更新中提到的,所有这些调用堆栈都是从
-(void)视图调用的,将显示:(BOOL)动画
,因此我猜此时所有内容都已加载。如果您得到“未能及时恢复”,通常是因为您的didFinishLaunchingWithOptions
花费的时间太长而无法返回。
- (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];
...
}