2017-02-09 108 views
0

随着近年来节省了工人的上下文版本的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。使用旧版Core Data实现Android,名为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

什么是'registerListener'和'onPostSave'?他们不是核心数据的一部分。 –

+0

有一个核心数据的Android实现。一位道德严谨的iOS开发人员制作了它。命名约定和方法就像在iOS中一样!它包含核心数据的基本功能。 Android的ORM。 https://github.com/dkharrat/NexusData我真的很喜欢它,我只需要'降级'的东西去工作。需要低估在Core-Data iOS之前的工作时间,在专利子上下文之前。 –

回答

0

它看起来像NexusData开发人员添加或改变了一些事情来处理(或最好的使用)平台的差异。

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