gpt4 book ai didi

java - 如何在 'old' Core Data中实现保存完成?

转载 作者:行者123 更新时间:2023-11-30 12:41:53 25 4
gpt4 key购买 nike

使用最新版本的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()
}
}
}

小菜一碟。

但是如果我需要使用 registerListeneronPostSave 事件怎么办?

我创建了全局完成闭包,并在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 开发人员添加或更改了一些内容来处理(或者可能是为了最好地利用)平台差异。

据我所知,registerListeneronPostSave 对应于 iOS NSManagedObjectContextDidSave 通知。使用 NotificationCenter 观察该通知。每当托管对象上下文保存更改时,都会调用观察者代码。在 Swift 中,合并方法是 mergeChanges(fromContextDidSave:)NSManagedObjectContext 发布了一些其他可能也有用的通知。

关于java - 如何在 'old' Core Data中实现保存完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42137998/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com