Реактивный вызов API на кнопке вызывает утечку - PullRequest
0 голосов
/ 02 июля 2018

Я знаю, что это не лучший вариант использования, но, скажем, у меня есть кнопка, которая вызывает API-сервис каждый раз, когда нажимается. Примерно так:

ViewController

myButton.tap.flatMap { [unowned self] _ in 
    return self.webService.apiCall()
}.suscribe(someObserver)
.disposed(by: self.disposeBag)

WebService

class WebService {
    func apiCall() -> Observable<[Result]> {
        return RxAlamofire.requestData(.get, url).map { [unowned self] response, data -> [MyResult] in
             return self.parse(data)
        }
    }
}   

Так что я использую каждое нажатие, чтобы запросить некоторую информацию. Теперь каждая наблюдаемая уникальна и неизменна, и каждое нажатие приведет к созданию новой наблюдаемой, на которую я подписываюсь.

Я ошибаюсь или это не значит, что у меня есть утечка, и все запрошенные наблюдаемые (то есть каждый вызов API) не удаляются? Что бы это был элегантный способ решить эту проблему?

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

1 Ответ

0 голосов
/ 02 июля 2018

Вы можете использовать flatMapLatest, который будет поддерживать только подписку на последнюю внутреннюю последовательность (apiCall в вашем случае). Это также означает, что очень близко tap s может завершить предыдущие вызовы, прежде чем они действительно вернут результат.

Если вы заставите apiCall вернуть Single или последовательность, которая генерирует результат и затем завершается, вы не будете накапливать подписки.

Кстати, это не утечка. Ваш disposeBag имеет ссылку на последовательность, поэтому в случае ее удаления вся память будет освобождена, что не приведет к утечке. Вы только должны убедиться, что замыкание не сохраняет self, но из вашего кода я не могу сказать, принадлежит ли apiCall к себе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...