Вы правы, что вам не нужно сохранять результат 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)
}
}
}