核心数据冻结所有应用程序

时间:2014-05-21 03:31:21

标签: ios multithreading core-data concurrency freeze

我在iOS应用上遇到Core Data并发问题。 在我的executeFetchRequest上,我尝试同步managedObjectContext请求,但有时此方法会冻结我的应用。

- (NSArray *)synchronizedWithFetchRequest:(NSFetchRequest *)request andError:(NSError **)error
{
    @synchronized(self.managedObjectContext)
    {
        return [self.managedObjectContext executeFetchRequest:request error:error];
    }
}

我已经尝试了许多内容,例如lock / unlockperformBlock / performBlockAndWaitdispatch_sync / dispatch_async,似乎没有工作

托管对象上下文创建:

 ...
    _managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
    [_managedObjectContext setPersistentStoreCoordinator:self.persistentStoreCoordinator];

有什么方法可以解决这个问题吗?并保持我的请求返回此方法的结果对象?

谢谢!

1 个答案:

答案 0 :(得分:1)

在MOC上同步表明有多个线程访问同一个MOC 这本身就违反了CoreData并发协议。

禁止此访问,除非它包含在上下文performBlock:方法(或其"等待"对应方)中。这将完全否定对@synchronized块的需求。

此线程/队列"绑定"扩展到上下文提取/注册的托管对象,因此,您将无法访问它们作为方法的返回值。