我正在使用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
}
如有任何建议,我们将不胜感激!
您真的必须通过创建可观察对象来单独观察每个数组吗。我认为最好观察Results
,这是查询的结果,而不是像这样观察每个项目
请参阅此处的示例。
然后,您可以将其封装在自己的可观察对象中,并根据Result中的更改,对特定对象进行回调。