RxSwift Realm наблюдает за массивом в RunLoop - PullRequest
0 голосов
/ 18 декабря 2018

Я использую RxSwift и RxRealm и хочу иметь возможность наблюдать за изменениями ресурсов на основе предиката.Функция будет выглядеть следующим образом:

func observe(type: String) -> Observable<[MyRealmObject]> {
  let realm = configureRealm() // 1
  let predicate = NSPredicate(format: "type = %@", type)
  let resources = realm
    .objects(MyRealmObject.self)
    .filter(predicate)
  return Observable.array(from: resources) // 2
}

Однако Realm требует, чтобы // 2 запускался в потоке с циклом выполнения, а // 1 и // 2 должны вызываться в одном потоке.

Я не могу гарантировать, что функция наблюдений (тип: String) уже вызывается в потоке с циклом выполнения, поэтому мне, вероятно, придется переключиться на один из них внутри функции - но таким образом я не смогубольше не иметь синхронного возвращаемого значения.

Есть ли какие-либо идеи о том, как гарантировать, что наблюдения за областью всегда гарантированно находятся в определенном цикле выполнения?

Обновление: использование пользовательского потокас циклом выполнения - но я все еще не удовлетворен

Я создал собственный поток, который имеет цикл выполнения, но получение синхронного возвращаемого значения просто уродливо - как вы можете видеть, я использовал DispatchGroup для синхронизации, и яочень бы хотелось этого избежать.

func observe(type: String) -> Observable<[MyRealmObject]> {
  let observableCalculation = {
    let realm = configureRealm() // 1
    let predicate = NSPredicate(format: "type = %@", type)
    let resources = realm
      .objects(MyRealmObject.self)
      .filter(predicate)
    return Observable.array(from: resources) // 2
  }

  if Thread.current == self.realmObservationThread {
    return observableCalculation()
  }

  var o: Observable<[MyRealmObject]>!
  let g = DispatchGroup()
  g.enter()
  self.realmObservationThread.runloop?.perform {
    o = observableCalculation()
    g.leave()
  }
  g.wait()
  return o
}

Будем благодарны за любые предложения!

1 Ответ

0 голосов
/ 21 декабря 2018

Вы действительно должны наблюдать каждый массив отдельно, создавая наблюдаемые.Я думаю, что лучше наблюдать Results, который является результатом запроса, а не наблюдать за каждым элементом, подобным этому.

См. Пример из здесь .

Вы могли бы тогдаоберните это внутри своей собственной наблюдаемой и, основываясь на изменениях в Результате, вы можете затем сделать обратный вызов для конкретного объекта.

...