2017-02-09 112 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發佈了一些其他可能也有用的通知。