executeFetchRequest:error:在主线程上冻结

时间:2013-06-07 09:00:38

标签: ios objective-c core-data

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”,但我认为这不会有任何区别......

1 个答案:

答案 0 :(得分:0)

我自己找到了答案。 显然我以非常不明显的方式使用persistentStoreCoordinator - 访问故障中的数据。我甚至不知道我的托管对象实际上是故障。我在后台线程中进行了访问。所以这就是让我痛苦的事情。

希望这会对某人有所帮助。