Подтвердить что ты не робот

Работа с открытыми асинхронными веб-запросами при выгрузке UIViewController (AFNetworking)

Здесь сценарий:

-A UIViewController (A) помещается в стек навигации -On viewDidLoad async GET вызывается с использованием AFNetworking (однопользовательский AFHTTPClient, общий для всего приложения) для заполнения различных пользовательских элементов в представлении (например, UILabel).
Пользователь нажимает кнопку "Назад" перед возвратом запроса. -Использовать другие контроллеры активного представления могут делать запросы, чтобы вы не могли отменить все открытые операции.

Итак, вопрос № 1: отслеживать открытые запросы, сделанные UIViewController A, и отменять выдающиеся, когда пользователь покидает это представление, или вы должны позволить им закончить и проигнорировать их? Поскольку AFNetworking использует блоки, обновляемые пользовательские элементы сохраняются внутри блока и, следовательно, не будут вызывать сбои, когда блок успеха/отказа выполняется после того, как представление было вытолкнуто. Однако недостаток, чтобы игнорировать их, кажется, является ненужным сетевым трафиком.

Вопрос № 2: где бы вы выполнили код для отмены операций, выполненных UIViewController A? viewDidDisappear не кажется правильным, потому что пользователь может перейти вперед (перетащил новое представление в стек), а не обратно (вытолкнул текущее представление), и в этом случае вы не хотите отменять открытые запросы, потому что пользователь может прийти вернуться к текущему виду, и он не будет загружаться снова. Тем не менее, я не думаю, что dealloc или viewDidUnload будут вызваны во время выполнения запроса, так как блок сохранит удержание на пользовательских элементах, поэтому я не думаю, что он может туда попасть.

Почитал бы по этому поводу мысли. Как вы считаете лучшей практикой?

4b9b3361

Ответ 1

Вообще говоря, вам действительно не нужно отменить запросы, когда пользователь покидает контроллер вида. С точки зрения управления памятью ссылка на блок self предотвратит любые сбои, вызванные отправкой сообщений на освобожденные экземпляры, поэтому не стоит беспокоиться.

Что касается удобства пользователей, я бы сказал, что вам не стоит беспокоиться об этом, пока не возникнет проблема (у нас есть уловка, чтобы угадать, что неправильно ошибается то, что будет медленным в наших приложениях). Однако, если вы делаете большие запросы GET, и это создает заметную медлительность, мое предложение состояло бы в том, чтобы контроллер выполнял HTTPClient -cancelAllHTTPOperationsWithMethod:path: в -viewDidUnload: (любой другой обратный вызов был бы преждевременным).

Ответ 2

Возможно, у вас может быть singleton, который управляет всеми сетевыми файлами, и просто установите его делегат на текущий vc (в viewDidLoad), чтобы вы получили любые входящие данные и отправили ему сообщение об отмене, когда vc исчезнет (или пусть другой делегат стал его делегатом). Или синглтон может хранить данные для доступа любым vc на более позднем этапе. По этой причине я стараюсь не вводить асинхронный код в свои VC.