【问题标题】:executeFetchRequest:error: freezes on main threadexecuteFetchRequest:错误:在主线程上冻结
【发布时间】:2013-06-07 09:00:37
【问题描述】:

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];
}

应用程序在最后一行冻结

这里还有一些其他的代码

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

【问题讨论】:

  • 我们能看到一些代码吗?你在哪里叫它?
  • @Dev2rights,我更新了我的问题。
  • 当然,但我想看看你在哪里调用 executeFetchRequest:error: 好像这是在一个未加载 UI 的地方,例如它会导致挂起。
  • @Dev2rights,“未加载 UI”是什么意思?正如我在更新中提到的,所有这些调用堆栈都是从- (void)viewWillAppear:(BOOL)animated 调用的,所以我猜此时一切都已加载。
  • 如果出现“无法及时恢复”,一般是因为您的didFinishLaunchingWithOptions返回时间过长。

标签: ios objective-c core-data


【解决方案1】:

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

希望对某人有所帮助。

【讨论】:

    猜你喜欢
    • 2011-12-21
    • 1970-01-01
    • 1970-01-01
    • 2019-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多