使用最新版本的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;
}
});
答案 0 :(得分:0)
看起来NexusData开发人员添加或更改了一些事情来处理(或者最好地利用)平台差异。
据我所知,registerListener
和onPostSave
对应于iOS NSManagedObjectContextDidSave
通知。使用NotificationCenter
观察该通知。只要托管对象上下文保存更改,就会调用观察者代码。在Swift中,合并方法是mergeChanges(fromContextDidSave:)
。 NSManagedObjectContext
发布一些可能也有用的其他通知。