如何在ReactiveCocoa中处理内部生产者?

时间:2015-10-08 23:52:32

标签: swift reactive-cocoa reactive-cocoa-3

我们说我想做并行工作,例如下载多张图片。这些下载中的每一个都由SignalProducer表示。我使用Merge策略创建并展平它们。当我启动外部生产商并获得一次性产品时,我预计处理这种产品也会处理内部生产商。实际发生的是,在处置之后,我的外部生产者停止接收事件,但内部生产者正在进行的实际工作仍在继续,因为它们尚未被处置。

如何让内部生产者完成的实际工作停止?这是一些说明该场景的测试代码:

func producerOfValues(values: [String]) -> SignalProducer<String, NoError> {
    return SignalProducer<String, NoError> {observer, disposable in
        for value in values {
            sleep(1)
            print("doing work: \(value)")
            sendNext(observer, value)
            if disposable.disposed { // 'disposed' is never true
                print("producer disposed")
                break
            }
        }
        sendCompleted(observer)
    }
}

let (signal, sink) = SignalProducer<SignalProducer<String, NoError>, NoError>.buffer(2)
let flattened = signal.flatten(.Merge)

let letterProducer = producerOfValues(["a", "b", "c"])
let numberProducer = producerOfValues(["1", "2", "3"])

sendNext(sink, letterProducer.startOn(QueueScheduler()))
sendNext(sink, numberProducer.startOn(QueueScheduler()))
sendCompleted(sink)

let disposable = flattened.startWithNext {
    print($0)
}
disposable.dispose()

输出:

doing work: a
doing work: 1
doing work: b
doing work: 2
doing work: c
doing work: 3

0 个答案:

没有答案