【问题标题】:Private queue NSManagedObjectContext save end in infinite loop私有队列 NSManagedObjectContext 在无限循环中保存结束
【发布时间】:2014-12-29 04:25:25
【问题描述】:

我在主线程上有一个主 NSManagedObjectContext 对象。还有一个私有队列NSManagedObjectContext 可以在不影响主线程的情况下进行快速的NSManagedObject 操作。

初始化这个私有队列NSManagedObjectContext的代码如下:

NSManagedObjectContext *tempContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
    tempContext.parentContext = _context;
    NSLog(@"LALALA");
    [tempContext performBlock:^{
    //do some work
    NSError *error;
        if([tempContext hasChanges]){
            [tempContext save:&error];
        }

        [_appDelegate saveMainContextWithCompletion:^{
         // do some work
        }];
    }];

应用程序在[tempContext save&error] 冻结,我使用 Instrument 来查看发生了什么。它显示没有内存泄漏,但我看到它在内存中无限地 malloc CFString

谁能告诉我为什么会出现这个错误?

【问题讨论】:

  • 你在perform block中做了什么样的工作?
  • @AdeelUrRehman 从tempContext 中获取一些NSManagedObject 并为一些属性分配新值,然后保存。顺便说一句,我将它与NSfetchedResultsControllerUITableView 一起使用。
  • 嗨亚瑟。我投了反对票,因为在你问这个问题的同一天有两个答案出现,一个仍然没有回应,也没有被投票。请对付出时间和精力的人做出回应。谢谢!

标签: ios objective-c xcode multithreading core-data


【解决方案1】:

由于 tempContext 不在主线程中,因此将代码包装在此:

if (tempContext != nil) {
    [tempContext performBlock:^{
        NSError *error = nil;
        if ([tempContext hasChanges] && ![tempContext save:&error]) {
            NSLog(@"error: %@\n UserInfo: %@\n", error, [error userInfo]);
        }
        else {
            //No error
        }
    }];
}

希望这会有所帮助.. :)

【讨论】:

  • 感谢您的建议,拉沙德。它不起作用。 [tempContext save:&error] 方法永远不会返回。它无限运行。
【解决方案2】:

问题可能在于您在应用程序委托和 saveMainContextWithCompletion 方法中所做的任何事情。您可能无意中导致后台线程和主线程不断向对方发布块以进行保存和合并。

您应该让后台上下文完成保存,并依靠 managedObjectContextDidSaveNotification 来响应主线程上的这些更改,而不是这样做。

最后,由于您设置了父上下文关系,因此您在后台上下文中所做的更改应该会为您传播。您不需要显式保存这两个上下文。

【讨论】:

    猜你喜欢
    • 2013-09-30
    • 2014-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多