2017-02-09 11 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() 
     } 
    } 
} 

Кусок торта.

Но как это сделать, если мне нужно использовать registerListener и onPostSave событие?

Я создал глобальное завершение закрытия и выполнил и очистил его в 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'? Они не являются частью Core Data. –

+0

Существует реализация данных Core Core для Android. Разработчик разработчика ethusiast iOS сделал это. Соглашение об именовании и подход похожи на iOS! Он содержит базовые функции Core Data. ORM для Android. https://github.com/dkharrat/NexusData Мне это очень нравится, мне просто нужно «понизить», чтобы работать. Необходимо отказаться от того, сколько лет работало Core Data в iOS, а также в контексте патента и ребенка. –

ответ

0

Похоже, разработчик NexusData добавил или изменил некоторые вещи, чтобы иметь дело с (или, возможно, лучше всего использовать) различия платформы.

Из того, что я могу сказать, registerListener и onPostSave соответствуют уведомлению iOS NSManagedObjectContextDidSave. Используйте NotificationCenter для наблюдения за этим уведомлением. Каждый раз, когда контекст управляемого объекта сохраняет изменения, вызывается код наблюдателя. В Swift метод слияния - mergeChanges(fromContextDidSave:). NSManagedObjectContext публикует некоторые другие уведомления, которые также могут быть полезны.

 Смежные вопросы

  • Нет связанных вопросов^_^