ios - RxSwift Realm 在 RunLoop 中观察数组
问题描述
我正在使用 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
在具有运行循环 AND 的线程上运行,// 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
哪个是查询的结果,而不是像这样观察每个项目。
从这里查看示例。
然后,您可以将其包装在您自己的 observable 中,并根据 Result 中的更改,然后您可以为特定对象执行回调。
推荐阅读
- parse-platform - 我试图使用 parse sdk for flutter 执行组合查询,但我不知道该怎么做
- javascript - 为什么这个 jQuery.animate() 函数不改变可见性?
- windows - Apache Zeppelin 在 Windows 上没有任何错误启动
- docker - Cloudbuild + lerna:正确的使用方法
- java - Hashmap updating for all keys if value is updated for a particular key
- python - 将日文字符解码为 Base64
- artifactory - Pip install 为 Artifactory 上传的包返回“找不到满足要求的版本”
- swift - 应用程序未保存有关输入栏错误“预期字符串但得到指针”的已发布评论
, 代码=111})" - html - 为什么我的子菜单没有显示在我的导航元素下?
- asp.net-mvc-5 - 被 CORS 策略 mvc5 阻止