创建用户可控的RxSwift Observer

时间:2016-04-12 00:06:59

标签: swift system.reactive frp rx-swift

我试图在基于Rx的网络代码中实现用户驱动的刷新,我目前的设计如下:

  1. 每次用户启动刷新操作时,创建一个传递Void值的接收器
  2. flatMap该广告联盟.Next上的最新Observable个活动进入了新的网络电话
  3. 将网络响应转换为新的视图模型并将其传递回视图控制器
  4. 我要挂断的部分是如何为这些事件创建一个接收器。我目前的代码如下:

    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>

0 个答案:

没有答案