【问题标题】:How to implement save completion in 'old' Core Data?如何在“旧”核心数据中实现保存完成?
【发布时间】:2017-02-09 13:27:56
【问题描述】:

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

【问题讨论】:

  • registerListeneronPostSave 是什么?它们不是核心数据的一部分。
  • Core Data 有一个 Android 实现。一位狂热的 iOS 开发者做到了。命名约定和方法就像在 iOS 中一样!它包含核心数据的基本功能。 Android 的 ORM。 github.com/dkharrat/NexusData 我真的很喜欢,我只需要“降级”的东西就可以开始工作了。需要了解在专利子上下文之前 iOS 中 Core Data 的工作时间。

标签: java android ios swift core-data


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-14
    • 1970-01-01
    • 1970-01-01
    • 2021-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-10
    相关资源
    最近更新 更多