save:方法是线程安全的吗?

时间:2014-09-12 11:20:58

标签: ios multithreading macos core-data nsmanagedobjectcontext

简而言之

我可以打电话吗

[moc performBlockAndWait:^{
    [moc save:NULL] ;
}];

同时来自不同的线程?

我添加类似于this one的崩溃,即:

Serious application error.  Exception was caught during Core Data change processing.  This is usually a bug within an observer of NSManagedObjectContextObjectsDidChangeNotification.  -[__NSCFSet addObject:]: attempt to insert nil with userInfo (null)
2011-06-15 11:36:59.864 myApp[457:607] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFSet addObject:]: attempt to insert nil'
*** Call stack at first throw:

程序在此命令崩溃:

[moc performBlockAndWait:^{
    [moc save:NULL] ;
}];

当我向尽可能多的线程启动相同的进程(带有差异参数)时(在NSOperationQueue的帮助下),此命令可能会被不同的线程同时调用。

这可能是个问题吗?或者方法performBlockAndWait:已经处理了这个问题?

我问你这个问题,知道我是否需要创建一个能够管理对moc的保存的单例。

1 个答案:

答案 0 :(得分:2)

必须从创建上下文的线程/队列中调用

-save:

调用-performBlockAndWait:确实避免从错误的线程调用它。

  1. 必须NSError传递给-save:方法,您需要查看-save:的结果以确定是否有错误发生了。这是了解错误是否发生的单一方式。传入NULL是一件麻烦事。

  2. 您目前看到的错误是直接导致保存。这很可能是因为你正在其他地方听NSManagedObjectContextDidSaveNotification并在那里做错事。在代码中搜索该常量并查看与其相关的代码。