#ios #swift3
#iOS #swift3
Вопрос:
Я хотел бы знать, в чем разница между ними, я пытаюсь что-то обновить в пользовательском интерфейсе, поэтому я должен сделать это с помощью основного потока, но не уверен, какой из них мне следует использовать для достижения того, чего я хочу.
Спасибо
Комментарии:
1. Очень хорошо описано в документах: developer.apple.com/library/archive/documentation/Performance /…
Ответ №1:
«Инициированный пользователем» означает, что пользователь напрямую запросил эту операцию и, вероятно, ожидает, но сам пользовательский интерфейс не отчаянно нуждается в результате. «Извлекать новые твиты, потому что пользователь выполнил pull-to-refresh» или «пересчитать подсказку». Эти вещи должны происходить быстро, но не сразу. Как только вычисление будет завершено, вы, вероятно, не будете запрашивать его снова немедленно.
«Интерактивный пользователь» означает, что пользователь напрямую взаимодействует с результатом этой операции в режиме реального времени. Пользовательскому интерфейсу нужен результат прямо сейчас, иначе произойдет задержка. Вероятно, вы будете запрашивать эту операцию быстро и неоднократно. Это наивысший приоритет.
Для получения полной информации об этих классах см. «Создание адаптивных и эффективных приложений с помощью GCD».
Комментарии:
1. итак, тогда я должен использовать .userInteractive для обновления пользовательского интерфейса
2. Разумное эмпирическое правило: если выполнение этого блока занимает больше 1/60 секунды (с момента, необходимого для планирования, до его завершения), то, очевидно, он не является интерактивным. Если задержка на 1/60 секунды вызовет проблемы с пользовательским интерфейсом, то так оно и есть. Приоритет взаимодействия с пользователем должен быть редким в вашей программе. Если это распространено, то вы, вероятно, неправильно поняли, что означает «приоритет». Все дело в том, что может быть отложено. Если все имеет высокий приоритет, то ничего.
3. Помните, что основная очередь в любом случае имеет наивысший приоритет и является последовательной, поэтому, если вы уже отправляете запросы в основную очередь, это не будет иметь значения. Это важно для вещей, которые вы запускаете в неосновных очередях.
4. @RobNapier нет, на самом деле я сказал, что
userInitiated amp; userInteractive
(оба) были самыми быстрыми (довольно схожая скорость) и.background amp; .default
намного медленнее (особенно.background
— самыми медленными). Итак, я согласен с.userInitiated
5. И это подводит нас к сути: используйте уровень, который описывает вашу ситуацию. Ваш пользователь что-то запросил, и они не могут двигаться вперед, пока вы не закончите обработку. Это не интерактивно, но пользователь ожидает. Это
.userInitiated
также происходит с использованием самых быстрых потоков..background
не просто «самый медленный». Он содержит много другой информации, например, о том, что приложение может работать нормально в течение очень долгого времени (часов или дней) без его запуска вообще. Это самый медленный поток, но он может даже не запускаться, что полностью отличается от потока с низким приоритетом.