调用[NSManagedObjectContext save:]时线程冻结

时间:2013-08-29 06:55:07

标签: ios multithreading nsmanagedobjectcontext

我正在使用sqlite文件来保存我的应用程序日志。为了同步多个线程,我使用了一个singleton对象并且@synchronized这个对象,只有一个线程可以保存一次日志。 NSManagedObjectContext的对象是日志对象singleton的成员。

我遇到了一个问题,当有许多线程保存他们的日志时,一个线程在调用[NSManagedObjectContext save:]时会冻结。没有其他线程可以进入@synchronized区域,这会导致所有这些线程冻结。我试图降低调用save:方法的频率(例如,当10个线程完成保存日志时调用save:一次),问题发生得更少。我确信数据的格式化是正确的,因为我尝试记录多次输入,并且冻结发生在中间。

您之前遇到过此问题吗?如果是这样,如何解决问题?似乎用我的方式可以降低频率,但它只是一个走动。我想知道在调用[NSManagedObjectContext save:]时应用程序冻结的原因。

感谢。

1 个答案:

答案 0 :(得分:0)

只有一个线程应该对托管对象上下文进行更新并保存(至少在任何时候)。在单例中创建NSOperationQueue,将其设置为一次只运行一个操作,然后通过新的NSOperation添加每个日志(可能是按块)。