【问题标题】:RxSwift Realm observe Array in RunLoopRxSwift Realm 在 RunLoop 中观察数组
【发布时间】:2018-12-18 13:17:33
【问题描述】:

我正在使用 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 必须在同一个线程上调用。

我不能保证已经在带有运行循环的线程上调用了 observe(type: 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
}

任何建议将不胜感激!

【问题讨论】:

    标签: ios swift realm grand-central-dispatch rx-swift


    【解决方案1】:

    你真的必须通过创建 observable 来单独观察每个数组吗?我认为最好观察Results 这是查询的结果,而不是像这样观察每个项目。

    查看来自here 的示例。

    然后您可以将其包装在您自己的 observable 中,并根据 Result 中的更改,然后为特定对象执行回调。

    【讨论】:

    • 有趣的方法,我试试看。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-03
    • 1970-01-01
    • 2016-06-16
    • 2017-01-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多