Назначение Disposables.create () в RxSwift - PullRequest
0 голосов
/ 31 августа 2018

Я изучаю RxSwift, и при создании Observables мне встретился следующий шаблон:

return Observable.create { observer in

    let disposable = Disposables.create()

    // Do some stuff with observer here

    return disposable
}

Насколько я могу судить, возвращаемый Одноразовый объект на самом деле ничего не делает, служит ли он какой-либо другой цели, кроме удовлетворения требований API по возврату Одноразового использования?

Есть ли сценарий, в котором вам может понадобиться вернуть настроенный Одноразовый?

Полагаю, что меня больше всего смущает то, что возвращаемый Disposable кажется отдельным от реализации создаваемого Observable, то есть он не назначен никаким свойствам или не передается везде, где он только что создан и возвращен.

Ответы [ 2 ]

0 голосов
/ 08 сентября 2018

Существует два варианта метода create по отношению к Disposables.

Первый, как упоминал Даниэль, используется при создании нового Observable; вы будете использовать закрытие Disposables.create { ... } для "очистки", в основном.

Это очень полезно при использовании flatMapLatest, так как ваш предыдущий запрос будет обработан, когда поступят новые. Всякий раз, когда он будет удален, будет вызван этот блок очистки.

Observable<Int>.create { observer in
    let someRequest = doSomeLongRunningThing { result in
        observer.onNext(result)
        observer.onCompleted()
    }

    return Disposables.create {
        // How can I "cleanup" the process?
        // Cancel the request, for example.
        someRequest.cancel()
    }
}

Второй вариант Disposables.create используется для совершенно другой цели - группирование нескольких Disposable объектов в качестве одного одноразового объекта (a CompositeDisposable).

Например:

let disposable1 = someAction()
let disposable2 = someOtherAction()

let compositeDisposable = Disposables.create(disposable1, disposable2)
0 голосов
/ 31 августа 2018

Функция Disposables.create принимает дополнительное закрытие. Вы должны поместить любой код отмены в это закрытие. Если у вас нет способа отменить, тогда код пуст.

Хорошим примером является обертка вокруг URLSession dataTask метода. В коде, отличном от Rx, при вызове URLRequest.shared.dataTask возвращается объект URLSessionDataTask, который можно использовать для отмены сетевого вызова. Функция cancel этого объекта вызывается в одноразовом доступе.

Другое распространенное использование - это когда вы подписываетесь на какую-то другую наблюдаемую из замыкания создания. Затем вы должны передать одноразовые из этих / этих подписок, вернув Disposables.create(myDisposable), чтобы эти подписки были отменены должным образом при утилизации вашего Observable.

...