2015-08-19 1 views
0

Я использую MagicalRecord для управления моими основными данными. Мое приложение часто получает фрагменты данных, которые требуют повторения, затем индивидуально добавляются в хранилище в виде записей и сохраняются. Я ввел этот код в NSOperation. Это выглядит примерно так:MagicalRecord с NSOperation вызывает проблемы с сохранением

class AddIncomingMessageOperation: NSOperation { 
    override func main() { 
     let context = NSManagedObjectContext.MR_context() 

     self.message = Message.createMessage(
      json: self.messageJSON, 
      context: context) 
     if self.message != nil { 
      context.MR_saveToPersistentStoreAndWait() 
     } 
    } 
} 

Запуск этого на NSOperationQueue.mainQueue, кажется, работает без проблем, кроме задерживая UI. Но мой следующий шаг - запустить все эти операции в своей собственной очереди фоновой работы. Добавляя их в этот NSOperationQueue и запуская их, вы получаете некоторые смешанные данные.

Что я имею в виду - моя функция createMessage проверяет существующий объект беседы и добавляет его в разговор, если он существует, или создает его, если это не так. Поэтому он требует знания того, что уже существует в магазине. Кажется, что происходит с тем, как они работают в фоновом режиме, это то, что они создают цепочки, которые только что были созданы в другой операции.

Я могу решить все это, установив operationQueue.maxConcurrentOperationCount = 1, но это, очевидно, замедляет все.

ответ

1

Вы не можете использовать контекст основного потока в фоновом потоке. Не в основных данных, а не в магической записи.

Используйте методы MR, предназначенные для фоновых операций, например saveWithBlock. Создание фоновых контекстов с помощью MR_newContext.

Если вы используете эти простые API-интерфейсы, вы можете отказаться от громоздких подклассов NSOperation.