Как быть с потоком и Realm? (iOS)

Я использую Realm для хранения объектов моей модели. В моем объекте у меня есть функция, которая генерирует NSData из собственных значений свойств. Эта генерация может быть длинной, поэтому я хотел бы создать NSData в потоке с блоком обработчика.

Моя проблема в том, что доступ к данным Realm возможен только в объекте создания Realm (фактически в основном потоке). Поэтому, когда я обращаюсь к своим свойствам RealmObject в потоке, происходит сбой приложения. Согласно спецификациям Realm, это нормально. Но как лучше всего сделать так, чтобы моя генерация NSData в потоке зависела от ограничений Realm?

На самом деле у меня есть две идеи:

  • создайте очередь отправки для конкретного Царства и заставьте весь мой доступ к Царству записываться в эту очередь
  • получить все необходимые свойства во временной структуре (или наборе переменных) и работать с этой структурой/переменными для создания моего NSData в потоке.

Я предполагаю, что многим пользователям Realm приходится иметь дело с потоками и Realm, так что же вы сделали в таком случае?


person Community    schedule 30.05.2016    source источник


Ответы (1)


Передайте идентификатор объекта коду, который выполняется в отдельном потоке. В этом потоке создайте экземпляр Realm (let realm = try! Realm()) и получите свой объект. Затем вы можете выполнить длинную генерацию и вернуть результат с обратным вызовом.

let objectId = "something"
dispatch_async(queue) {
  let realm = try! Realm()
  let myObject = realm.objectForPrimaryKey(MyObject.self, key: objectId)
  let result = myObject.longOperation()

  // call back with results
}

or

let objectRef = ThreadSafeReference(to: myObject)
DispatchQueue(label: "background").async {

   autoreleasepool {
        let realm = try! Realm()
        guard let myObject = realm.resolve(objectRef) else {
            return // object was deleted
        }

        let result = myObject.longOperation()
        // call back with results
   }
}
person Marcel    schedule 30.05.2016