2013-08-29 58 views
0

线程冻结我正在使用sqlite文件来保存我的应用程序的日志。为了同步多个线程,我使用了一个单例对象,并@synchronized这个对象只有一个线程可以一次保存日志。 NSManagedObjectContext的对象是日志对象单例的成员。当调用[NSManagedObjectContext保存:]

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

您以前遇到过这个问题。如果是这样,如何解决这个问题?看来,用我的方式可以降低频率,但它只是散步。我希望知道调用[NSManagedObjectContext save:]时应用程序冻结的原因。

谢谢。

回答

0

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

+0

我用@synchronized只让一个线程更新NSManagedObjectContext,所以实际上每次只有一个线程调用[NSManagedObjectContext save:]。问题是如果这个方法被频繁调用,它会被随机冻结。 – AthlonFX87

相关问题