我试图在基于Rx的网络代码中实现用户驱动的刷新,我目前的设计如下:
Void
值的接收器flatMap
该广告联盟.Next
上的最新Observable
个活动进入了新的网络电话我要挂断的部分是如何为这些事件创建一个接收器。我目前的代码如下:
func contactListModel() -> Observable<ContactListViewModel<Contact>> {
// Create a sink for refresh events
var refreshSink: AnyObserver<Void> = AnyObserver { event in }
let refreshObservable = Observable<Void>.create { observer in
refreshSink = observer
return NopDisposable.instance
}
// Define action handlers
let searchClosure = { (query: String?) in
self.contactsSearchTerm.value = query
}
let refreshClosure = refreshSink.onNext
// TODO: [RP] Make contact list view controller handle a nil view model to remove the need for this code
let initialViewModel = ContactListViewModel<Contact>(contacts: [], searchClosure: searchClosure, refreshClosure: refreshClosure)
// Perform an initial refresh
defer {
refreshSink.onNext()
}
// Set up subscription to push a new view model each refresh
return refreshObservable
.flatMapLatest {
return self.networking.request(.ListContacts)
}
.mapToObject(ListContactsResponse)
.map { response in
return ContactListViewModel(contacts: response.contacts, searchClosure: searchClosure, refreshClosure: refreshClosure)
}
.startWith(initialViewModel)
}
现在很明显,为什么我创建事件接收器的代码在这里不起作用。传递到refreshObservable
create
方法的块只有在观察者订阅后才会被调用,因此refreshSink
不会被重新分配到那时为止。此外,如果此observable订阅多次,则refreshSink
变量将被重新分配。
所以我的问题是:如何创建Observable
我可以手动推送事件?或者,我可以在这里使用更好的设计吗?
我知道ReactiveCocoa在pipe
上有Signal
静态方法可以做我喜欢的事情,但我在Rx API中找不到相应的东西。< / p>