Обработка взаимодействия с пользователем во время ожидания перехода после загрузки с использованием Alamofire

Мой проект отображает элементы в табличном представлении. Когда пользователь щелкает ячейку, ячейка расширяется, чтобы показать больше информации (например, вкладка обновлений App Store), и если пользователь нажимает эту расширенную ячейку, элемент, указанный в ячейке, открывается на новой странице (опять же, как в App Store). ). Однако этот элемент должен быть загружен с использованием запроса Alamofire, прежде чем его можно будет отобразить. Чтобы ускорить процесс, я начинаю загрузку элемента, когда ячейка расширяется, поэтому, когда пользователь решит открыть элемент, возможно, он уже завершил загрузку.

Однако в этом и заключается моя проблема: некоторые элементы загружаются быстро, поэтому они, скорее всего, загружаются, когда пользователь открывает элемент (второе нажатие). Однако некоторые элементы намного больше и требуют больше времени для загрузки (до 6 секунд). Как мне обрабатывать пользовательский ввод, если элемент еще не закончил загрузку и, более того, как мне это реализовать?

Самый простой способ — полностью игнорировать пользовательский ввод, проверяя, загружается ли элемент при каждом нажатии, чтобы запустить переход. Однако неправильно игнорировать пользователя, и ему приходится нажимать более одного раза с одним и тем же намерением. Точно так же я использовал dispatch_group_wait() в основном потоке, но это еще хуже, потому что он блокирует все входные данные.

Я хотел бы добиться следующего:

  1. Первое нажатие: начать запрос на загрузку и сохранить его в переменной (это уже сделано). Я не хочу запускать переход в completionHandler запроса, потому что мы еще не знаем, будет ли
  2. Второй тап:

    а. Если элемент загружен, запустите переход, чтобы открыть его.

    б. Если элемент еще не закончил загрузку, отложите запуск перехода до конца загрузки.

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


person Jonas Zaugg    schedule 18.08.2016    source источник


Ответы (1)


Вы можете использовать функцию shouldPerformSegueWithIdentifier: для отмены перехода.

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

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

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

person Paulw11    schedule 18.08.2016
comment
Большое спасибо! Я знал, что есть простой способ, но смотрел на проблему не с той стороны, фокусируясь только на замыканиях и Alamofire. Я уже внедрил флаги и индикаторы активности для своих предыдущих попыток, но ваш ответ — недостающая часть моей головоломки;) Ура - person Jonas Zaugg; 19.08.2016