{ value in button.isEnabled = value }) textField.reactive.continuousTextValues.skipNil() let disposable = .map { text in text.characters.count > 0 } .observe(observer) disposable?.dispose() SOURCE CONSUMER SCOPE OPERATOR
(event) in switch event { case let .value(v): print("value = \(v)”) case let .failed(error): print("error = \(error)”) case .completed: print(“completed") case .interrupted: print("interrupted") } }
for i in 0..<10 { } input.send(value: timeElapsed) DispatchQueue.main.asyncAfter(deadline: .now() + Double(timeElapsed)) { } let timeElapsed = index * 5
the signal ‣ Create the observer let signalObserver = Observer<Int, Never> ( value: { value in print("Time elapsed = \(value)") }, completed: { print("completed") }, interrupted: { print("interrupted") } )
the signal ‣ Create the observer let signalObserver = Observer<Int, Never> ( value: { value in print("Time elapsed = \(value)") }, completed: { print("completed") }, interrupted: { print("interrupted") } ) let (output, input) = Signal<Int, Never>.pipe() for i in 0..<10 { let timeElapsed = index * 5 DispatchQueue.main.asyncAfter( deadline: .now() + Double(timeElapsed)) { input.send(value: timeElapsed) } }
the signal ‣ Create the observer let signalObserver = Observer<Int, Never> ( value: { value in print("Time elapsed = \(value)") }, completed: { print("completed") }, interrupted: { print("interrupted") } ) let (output, input) = Signal<Int, Never>.pipe() for i in 0..<10 { let timeElapsed = index * 5 DispatchQueue.main.asyncAfter( deadline: .now() + Double(timeElapsed)) { input.send(value: timeElapsed) } } output.observe(signalObserver)
{ (observer, lifetime) in } for i in 0..<10 { } if i == 9 { //Mark completion on 9th iteration observer.sendCompleted() } observer.send(value: timeElapsed) } DispatchQueue.main.asyncAfter(deadline: .now() + Double(timeElapsed)) { let timeElapsed = index * 5
the signalProducer ‣ Create the observer let signalObserver = Observer<Int, Never> ( value: { value in print("Time elapsed = \(value)") }, completed: { print("completed") }, interrupted: { print("interrupted") } ) let signalProducer: SignalProducer<Int, Never> = SignalProducer { (observer, lifetime) in for i in 0..<10 { let timeElapsed = index * 5 DispatchQueue.main.asyncAfter( deadline: .now() + Double(timeElapsed)) { observer.send(value: timeElapsed) if i == 9 { observer.sendCompleted() } } } }
the signalProducer ‣ Create the observer let signalObserver = Observer<Int, Never> ( value: { value in print("Time elapsed = \(value)") }, completed: { print("completed") }, interrupted: { print("interrupted") } ) let signalProducer: SignalProducer<Int, Never> = SignalProducer { (observer, lifetime) in for i in 0..<10 { let timeElapsed = index * 5 DispatchQueue.main.asyncAfter( deadline: .now() + Double(timeElapsed)) { observer.send(value: i) if i == 9 { observer.sendCompleted() } } } } signalProducer.start(signalObserver)
can be “disposed”, usually associated with freeing resources or canceling work. let disposable: Disposable? = signal.observe(signalObserver) disposable.dispose()
can be “disposed”, usually associated with freeing resources or canceling work. disposable.dispose() let disposable: Disposable? = signalProducer.start(signalObserver)
{ (observer, lifetime) in } for i in 0..<10 { } if i == 9 { observer.sendCompleted() } observer.send(value: timeElapsed) } DispatchQueue.main.asyncAfter(deadline: .now() + Double(timeElapsed)) { let timeElapsed = index * 5
{ (observer, lifetime) in } for i in 0..<10 { } if i == 9 { observer.sendCompleted() } observer.send(value: timeElapsed) } DispatchQueue.main.asyncAfter(deadline: .now() + Double(timeElapsed)) { let timeElapsed = index * 5 Lifetime of the produced signal
{ (observer, lifetime) in for i in 0..<10 { let timeElapsed = index * 5 DispatchQueue.main.asyncAfter(deadline: .now() + Double(timeElapsed)) { guard !lifetime.hasEnded else { observer.sendInterrupted() return } observer.send(value: timeElapsed) if i == 9 { observer.sendCompleted() } } } }
in TV ‣ Like on demand stream in Youtube ‣ Sequence of stream is same for all observer ‣ Sequence of stream is different for different observer ‣ Observer cannot interrupt the stream ‣ Observer can interrupt the stream ‣ Can represent event streams that are already “in progress,” such as notifications, user input ‣ Can represent operations or tasks which need to be started such as network requests
signalProducer) property.producer.startWithValues { value in print("[Observing SignalProducer] Time elapsed = \(value)") } property.signal.observeValues { value in print("[Observing Signal] Time elapsed = \(value)") }
!lifetime.hasEnded else { observer.sendInterrupted() return } observer.send(value: timeElapsed) if i == 9 { observer.sendCompleted() } } let signalProducer: SignalProducer<Int, Never> = SignalProducer { (observer, lifetime) in } for i in 0..<10 { } let timeElapsed = index * 5
!lifetime.hasEnded else { observer.sendInterrupted() return } observer.send(value: timeElapsed) if i == 9 { observer.sendCompleted() } } let signalProducerGenerator: (Int) -> SignalProducer<Int, NoError> = { timeInterval in return SignalProducer { (observer, lifetime) } for i in 0..<10 { } let timeElapsed = index * timeInterval
!lifetime.hasEnded else { observer.sendInterrupted() return } observer.send(value: timeElapsed) if i == 9 { observer.sendCompleted() } } let signalProducerGenerator: (Int) -> SignalProducer<Int, NoError> = { timeInterval in return SignalProducer { (observer, lifetime) } for i in 0..<10 { } let timeElapsed = index * timeInterval
= signalProducerGenerator(2) signalProducer1.startWithValues { value in print("value from signalProducer1 = \(value)") } signalProducer2.startWithValues { value in print("value from signalProducer2 = \(value)") }
the signal ‣ Create the observer let (output, input) = Signal<Int, Never>.pipe() for i in 0..<10 { DispatchQueue.main.asyncAfter( deadline: .now() + 5.0 * Double(i)) { input.send(value: timeElapsed) } } output.observe(signalObserver) Create the BindingTarget let signalObserver = BindingTarget<Int>( lifetime: self.reactive.lifetime) { value in print("Time elapsed = \(value)") }
the signal ‣ Create the observer let (output, input) = Signal<Int, Never>.pipe() for i in 0..<10 { DispatchQueue.main.asyncAfter( deadline: .now() + 5.0 * Double(i)) { input.send(value: timeElapsed) } } output.observe(signalObserver) Create the BindingTarget let signalObserver = BindingTarget<Int>( lifetime: self.reactive.lifetime) { value in print("Time elapsed = \(value)") }
the signal ‣ Create the observer let (output, input) = Signal<Int, Never>.pipe() for i in 0..<10 { DispatchQueue.main.asyncAfter( deadline: .now() + 5.0 * Double(i)) { input.send(value: timeElapsed) } } signalObserver <~ output Create the BindingTarget let signalObserver = BindingTarget<Int>( lifetime: self.reactive.lifetime) { value in print("Time elapsed = \(value)") } Bind the signal
concat latest flatMap Signal Producer then first retry repeat single last wait replayLazily Misc. materialize dematerialize sample timeout attempt attemptMap promoteError OPERATORS