Reactive Cocoa 5 and ReactiveSwift

I am trying to find out if network request processing can be suitable for my needs using ReactiveSwift and RAC5.

Under topics Migrating from RACSignal to ReactiveSwift or RAC5 I was told that this can be done using SignalProducer, but digging into it did not produce the expected results

So, I would like to:
1. Each time the text changes in the text field of the send request (search by keyword).
2. As soon as the user closes the current ViewController, the current request should be canceled automatically

3. Be able to cancel the request after changing the keyword

That's what i

self.textField.reactive.continuousTextValues.skipNil().filter({ (value) -> Bool in
        return value.characters.count > 0
    }).observeValues { [unowned self] (value) in
        self.fetchSignalDisposable?.dispose()
        self.fetchSignal = self.producerFor(keyword: value).on(started: {
            print("started")
        }, failed: { (error) in
            print("error")
        }, completed: {
            print("completed")
        }, value: { [unowned self] (items) in
            print("value")
            self.items.append(contentsOf: items)
            self.tableView.reloadData()
        })
        self.fetchSignalDisposable = self.fetchSignal!.start()
    }

And here is the manufacturer initializer

return SignalProducer<Any, NSError> { (observer, disposable) in
        let task: URLSessionDataTask? = NetworkClient.fetchRequestWith(uri: "test", parameters: ["keyword" : keyword], success: { response in
            observer.send(value: response)
            observer.sendCompleted()
        }, failure: { error in
            observer.send(error: error)
            observer.sendCompleted()
        })
        disposable += {
            task?.cancel()
        }
    }

:
1. " ", , , , .

/ :
1. VC ( ), watchValue . .skipRepeats(), , , . , , VC 2. completed , send(error: error)
3. - , VC, , . , , viewController signalProducer. self.fetchSignalDisposable?.dispose() deinit VC . - value, " "

:
1. - "" ,
2. textFields , VC
3. , VC

P.S.: , , , !

+3
1

" " ReactiveSwift readme . , observeValues , .flatMap(.latest), SignalProducer, ( , , , , ):

self.textField.reactive.continuousTextValues
    .skipNil()
    .filter { (value) -> Bool in
        return value.characters.count > 0
    }
    .flatMap(.latest) { [unowned self] value in
        return self.producerFor(keyword: value)
            // Handling the error here prevents errors from terminating
            // the outer signal. Now a request can fail while allowing
            // subsequent requests to continue.
            .flatMapError { error in
                print("Network error occurred: \(error)")
                return SignalProducer.empty
            }
    }
    .observe(on: UIScheduler())
    .observe { [unowned self] event in
        switch event {
        case let .value(items):
            print("value")
            self.items.append(contentsOf: items)
            self.tableView.reloadData()

        case let .failed(error):
            print("error")

        case .completed, .interrupted:
            print("completed")
        }
    }

.latest , , .

, , , . - .take(during: self.reactive.lifetime) , self , , observe.

. , . , , , , .

+4

Source: https://habr.com/ru/post/1675640/


All Articles