作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
使用最新版本的Core Data
保存工作线程上下文如下:
open class func upsertClient(completionOnMain: @escaping () -> ()) {
let contextTemporary = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType)
contextTemporary.parent = context
contextTemporary.perform {
try! contextTemporary.save()
context.perform {
try! context.save()
completionOnMain()
}
}
}
小菜一碟。
但是如果我需要使用 registerListener
和 onPostSave
事件怎么办?
我创建了全局完成闭包,并在onPostSave
中执行并清除它。但由于它是从两个不同的线程写入的,有时完成会执行两次。下面的代码是JAVA。使用为 Android 实现的旧的 Core Data
称为 nexus-data
,不用担心,它就像在 iOS 中一样。寻找伪代码解决方案。
public static void upsertClient(final Runnable completionRunnable) {
saveCompletionHandler = completionHandler;
saveCompletionRunnable = completionRunnable;
contextWorker.save();
}
ObjectContextNotifier.registerListener(new ObjectContextNotifier.DefaultObjectContextListener() {
@Override public void onPostSave(ObjectContext c, ChangedObjectsSet changedObjects) {
// ensure that the notification we just got is not from our own context, and that it's from a context using a
// persistence store that our context is also using.
if (c != context && c.getPersistentStoreCoordinator() == context.getPersistentStoreCoordinator()) {
// do saving
}
saveCompletionRunnable = null;
saveCompletionHandler = null;
}
});
最佳答案
看起来 NexusData 开发人员添加或更改了一些内容来处理(或者可能是为了最好地利用)平台差异。
据我所知,registerListener
和 onPostSave
对应于 iOS NSManagedObjectContextDidSave
通知。使用 NotificationCenter
观察该通知。每当托管对象上下文保存更改时,都会调用观察者代码。在 Swift 中,合并方法是 mergeChanges(fromContextDidSave:)
。 NSManagedObjectContext
发布了一些其他可能也有用的通知。
关于java - 如何在 'old' Core Data中实现保存完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42137998/
我是一名优秀的程序员,十分优秀!