2016-03-09 59 views
12

我有一个可观察的事件,我只想启动一次。该文档说:在RxSwift中处理一次性观察值的正确方法

使用处理袋或takeUntil运算符是确保资源清理的强大方法。我们推荐在生产中使用它们,即使序列在有限的时间内终止。

我只是一个事件后观察到的终止

let observable = Observable.create() { observer in 
    webservice.makeHTTPRequestWithCompletionBlock { 
    if something { 
     observer.on(.Next(...)) 
     observer.onCompleted() 
    } else { 
     observer.on(.Error(...)) 
    } 
    } 
} 

说我不感兴趣的用户取消该观察的,我只是希望它运行一次,完整。我希望这个可观察对象的生命周期在作品本身完成时结束。这意味着没有好的候选我可以看到disposeBag。 takeUntil也期待一个'事件',并且没有我能看到的好东西。

现在我只是解决了扔掉一次性警告:

_ = observeable.subscribeNext { ... } 

有没有办法做到这一点,或者说我应该使用不同的模式?

回答

19

两个DiposeBagtakeUntil用于取消订阅之前于接收到所述事件.Completed/.Error

Observable完成时,用于管理订阅的所有资源都会自动处理。

截至RxSwift 2.2,您可以在AnonymousObservable.swift

func on(event: Event<E>) { 
    switch event { 
    case .Next: 
     if _isStopped == 1 { 
      return 
     } 
     forwardOn(event) 
    case .Error, .Completed: 
     if AtomicCompareAndSwap(0, 1, &_isStopped) { 
      forwardOn(event) 
      dispose() 
     } 
    } 
} 

见证实施的例子这种行为见在接受一个.Error.Completed事件时,将事件转发后AnonymousObservableSink调用自身如何处置。

总之,对于您的用例,_ =是要走的路。

相关问题