【发布时间】:2017-05-06 16:34:24
【问题描述】:
我需要 viewModel 中的一些内部状态,但也尝试遵循“无订阅/绑定/驱动/...”的理想方法,并且仅在 Observables 之间进行组合。
如何指定Variable 观察到的内容?
例子:
private var userProfilesToFetch = Variable<[String]>([])
private var users: Variable<[User]> {
return //something that observes fetchUserProfiles() and when it emits, appends to its .value
}
private func fetchUserProfiles() -> Observable<User?> {
let reference = databaseRef.child("users")
return userProfilesToFetch.asObservable()
.filter({ $0 != [] })
.map({ $0.last! })
.flatMap({ (userId) -> Observable<User?> in
return self.service.observeAllChildren(of: reference.child(userId), by: .value)
.map({ (snapshot) -> User? in
guard let values = snapshot.value as? [String: AnyObject] else { return nil }
var user = User(dictionary: values)
user.id = snapshot.key
return user
})
})
}
【问题讨论】:
-
如果没有订阅或绑定,那么什么都不会发生。 Observables 是惰性的,除非被观察,否则不会做任何工作。
-
@DanielT。同意,但实现“最大关注点分离”的重点是从视图控制器中的调用链接订阅。 问题是我不知道如何在订阅链中包含
Variable。 例如,如果在我的 VC 中我订阅了我的 viewModel 中的 (A),那么因为这个 (A) 是绑定的到其定义中的另一个可观察对象,如上面的fetchUserProfiles()函数,它将链接订阅userProfilesToFetch等等。我想不通的是如何通过指定它应该观察什么来链接变量本身。
标签: ios swift rx-swift reactivex