Я использую 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
}
Будем благодарны за любые предложения!