Пожизненная цель на ReactiveSwift - PullRequest
0 голосов
/ 28 ноября 2018

Я использую ReactiveSwift уже несколько месяцев, но есть кое-что, что я не до конца понимаю: объекты жизни.

Например, допустим, у меня есть SignalProducer, который создаст APIвызов, это обернуто для класса:

class ServiceWrapped {

    private let service: Service // the method called on this object returns the SignalProducer
    private let (lifetime, token) = Lifetime.make()

    // more stuff

    func fetchSomething(completion: @escaping (Value?, Error?) -> Void) {
        lifetime += service.fetchSomething()
            .startWithResult { result in
                switch result {
                case .success(let value):
                    completion(value, nil)
                case .failure(let error):
                    completion(nil, error)
                }
        }
    }
}

Мой вопрос: необходимо ли использовать lifetime в этом случае?

Я понял, что lifetime сохранит службувызовите, так что у него есть что-то, когда он вернется, но так как это также обернуто на ServiceWrapped Я не думаю, что использование lifetime действительно необходимо.

Заранее спасибо.

1 Ответ

0 голосов
/ 29 ноября 2018

Вы правы, что вам не нужно сохранять результат startWithResult, чтобы сохранить подписку. соответствующая часть документации гласит: :

A Signal должно быть публично сохранено для присоединения новых наблюдателей, но не обязательно для поддержания потока событий живым.Более того, Signal сохраняется до тех пор, пока существует активный наблюдатель.

Так что, пока вы не утилизируете объект, возвращенный из startWithResult, операция будет продолжаться, даже есливы не сохраняете его.

Скорее, Lifetime означает отмену операций.В этом случае, поскольку вы прикрепили результат startWithResult к времени жизни ServiceWrapped, операция будет отменена при освобождении объекта ServiceWrapped.Если вы опустите lifetime +=, то операция продолжится, даже если ServiceWrapped освобожден.

Практический пример того, почему это полезно, если у вас есть контроллер представления, который загружает изображение из Интернета.Если пользователь закрывает контроллер представления до завершения загрузки изображения, вы, вероятно, захотите отменить веб-запрос.Вы можете сделать это, связав производителя загрузки изображения со временем жизни контроллера представления.Речь идет не о поддержании веб-запроса, а об его отмене, когда он больше не нужен.

В дополнение к стилю, документация рекомендует использовать операторы, а не обрабатывать результат startWithResult:

func fetchSomething(completion: @escaping (Value?, Error?) -> Void) {
    service.fetchSomething()
        .take(during: lifetime)
        .startWithResult { result in
            switch result {
            case .success(let value):
                completion(value, nil)
            case .failure(let error):
                completion(nil, error)
            }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...