我的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];

有什么办法解决吗?并保持我的请求返回此方法上的结果对象?

谢谢!

最佳答案

在MOC上进行同步表明,有多个线程在访问同一MOC。
这本身就是对CoreData并发协议的违反。

除非将此访问包装在上下文performBlock:方法(或其对应的“wait”对象)中,否则将禁止该访问。这将完全不需要@synchronized块。

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

关于ios - 核心数据卡住了所有应用程序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23773466/

10-10 11:18
查看更多