【发布时间】: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