2

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

4

1 回答 1

0

我自己找到了答案。显然我以一种非常不明显的方式使用persistentStoreCoordinator - 访问错误中的数据。我什至不知道我的 managedObjects 实际上是错误的。我在后台线程中进行了访问。所以这就是让我如此痛苦的事情。

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

于 2013-06-11T15:01:55.920 回答