核心数据锁因为合并?
Posted
技术标签:
【中文标题】核心数据锁因为合并?【英文标题】:Core Data Lock because of merge? 【发布时间】:2013-10-15 21:01:26 【问题描述】:我有一个在后台运行的刷新过程(只使用 performInBackground 就可以了),其中一部分有数据库更新,所以我有一个单独的 MOC 用于后台线程。然后我使用 didSave 通知将更改合并到主 MOC。当应用程序在后台刷新时,用户可以在 UI 周围单击。
大部分都有效,但我时不时地看到一些锁。当我查看锁之前调用的方法时,它访问了主 MOC。我的刷新过程中没有任何东西可以访问它,所有东西都可以访问后台 MOC。但是,我在想我对后台 MOC 所做的更改确实会使用 didSave 通知合并。如果我在执行 mergeChangesFromContextDidSaveNotification 时尝试查询一个 MOC,那会是问题吗?解决这个问题的最佳方法是什么?我以为我已经用一个单独的 MOC 为我的后台线程解决了我的数据库问题,但是合并将是一个问题,对吧?
【问题讨论】:
【参考方案1】:你在正确的轨道上。每个线程使用自己的 MOC;当后台线程更新数据时,主 UI 线程会收到通知。您所描述的内容中没有任何内容会导致锁定。您遇到的锁定很可能是由于在主线程中执行长时间运行的代码,阻塞了 UI,而您认为此处理是在后台线程中完成的。
【讨论】:
非常感谢!所以合并不是问题吗?我担心访问一个合并的moc会是一个问题,但它可以处理吗?我不需要第三个 MOC(一个主要,一个背景,一个用于背景合并)或类似的东西?你能扩展锁定的可能原因吗?我不认为我以前用我的代码遇到过这个问题,只是现在在重新设计背景内容之后。例如,我启动了,然后对 UI 不做任何其他事情,我就放手了。但我仍然看到 [NSPersistentStoreCoordinator lock]、[_PFLock lock]、pthread_mutex_lock、_psynch_mutexwait 您所描述的不需要第三个 MOC。当代码在主线程中运行时,我遇到了锁,但我不打算这样做;例如,如果您对在主线程上执行的回调和通知进行任何数据处理。我的主moc分配如下:newMoc = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType],我的背景一个只是:newMoc = [[NSManagedObjectContext alloc] init]。 非常感谢您的回复,很高兴知道我不需要第三个。那么如果在我的主线程中访问主 MOC,它是如何工作的呢?我可以访问它,即使它可能正在合并,它也知道如何给我数据?我需要在主线程上调用合并吗?我的主要 MOC 我也使用 alloc init,但没有并发类型。是否像在初始化期间使用它一样容易使用? 抱歉回复晚了;以duckrowing.com/2010/03/11/using-core-data-on-multiple-threads 为例。如果你搜索 NSManagedObjectContextDidSaveNotification 和 Marcus Zara,你会发现很多很棒的文章和如何做到这一点的解释。你走在正确的轨道上;保持简单并遵循我提供的参考资料中的建议。 非常感谢!我觉得我很亲近!我看看你提到的链接。以上是关于核心数据锁因为合并?的主要内容,如果未能解决你的问题,请参考以下文章