如何在“旧”核心数据中实现保存完成?

时间:2017-02-09 13:27:57

标签: java android ios swift core-data

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

1 个答案:

答案 0 :(得分:0)

看起来NexusData开发人员添加或更改了一些事情来处理(或者最好地利用)平台差异。

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