В Swift 2 мне удалось создать очередь со следующим кодом:
let concurrentQueue = dispatch_queue_create("com.swift3.imageQueue", DISPATCH_QUEUE_CONCURRENT)
Но это не компилируется в Swift 3.
Каков предпочтительный способ написать это в Swift 3?
ios
swift3
xcode8
grand-central-dispatch
dispatch-after
Картик Кумар
источник
источник
DispatchQueue(label: "your-label")
для последовательной очереди. Все дополнительные параметры имеют значения по умолчанию.Ответы:
Создание параллельной очереди
Создать последовательную очередь
Получить основную очередь асинхронно
Получить основную очередь синхронно
Чтобы получить один из фонового потока
Xcode 8.2 beta 2:
Чтобы получить один из фонового потока
Если вы хотите узнать об использовании этих очередей. Посмотрите этот ответ
источник
attributes: .serial
при создании последовательной очереди:let serialQueue = DispatchQueue(label: "queuename")
.Компилируется под> = Swift 3 . Этот пример содержит большую часть синтаксиса, который нам нужен.
QoS - новый синтаксис качества обслуживания
weak self
- чтобы нарушить удержание цикловесли личность недоступна, ничего не делай
async global utility queue
- для сетевого запроса не ожидает результата, это параллельная очередь, блок (обычно) не ждет при запуске. Исключением для параллельной очереди может быть то, что, когда предел ее задачи был ранее достигнут, тогда очередь временно превращается в последовательную очередь и ожидает завершения какой-либо предыдущей задачи в этой очереди.async main queue
- для прикосновения к пользовательскому интерфейсу блок не ждет результата, а ждет своего слота в начале. Основная очередь является последовательной очередью.Конечно, вам нужно добавить некоторые проверки ошибок к этому ...
источник
guard
чтоself
неnil
на вершине, так что ни один из кодов не выполняется , если этоnil
, например,guard strongSelf = self else { return }
..global(qos: .background)
для ввода-вывода (сетевой запрос). Используйте.global(qos: .default)
или.global(qos: .utility)
вместо.Скомпилировано в XCode 8, Swift 3 https://github.com/rpthomas/Jedisware
источник
Поскольку на вопрос ОП уже был дан ответ, я просто хочу добавить некоторые соображения по поводу скорости:
Очень важно, какой приоритетный класс вы назначаете асинхронной функции в DispatchQueue.global .
Я не рекомендую запускать задачи с приоритетом потока .background, особенно на iPhone X, где кажется, что задача распределена по ядрам с низким энергопотреблением.
Вот некоторые реальные данные из вычислительно интенсивной функции, которая читает из файла XML (с буферизацией) и выполняет интерполяцию данных:
Имя устройства / .background / .utility / .default / .userInitiated / .userInteractive
Обратите внимание, что набор данных не одинаков для всех устройств. Это самый большой на iPhone X и самый маленький на iPhone 5s.
источник
Я сделал это, и это особенно важно, если вы хотите обновить свой пользовательский интерфейс, чтобы отображать новые данные без уведомления пользователя, как в UITableView или UIPickerView.
источник
// используем Очередь операций, если вам нужно заполнить объекты (метки, изображение, текстовое представление) на вашем контроллере вида
источник
Я переработал ваш код в Xcode 8, Swift 3, и изменения помечены в отличие от вашей версии Swift 2.
источник
Свифт 3
Вы хотите вызвать некоторое замыкание в быстром коде, затем вы хотите изменить раскадровку, если вы измените любой тип, принадлежащий просмотру, ваше приложение потерпит крах
но вы хотите использовать метод отправки ваше приложение не будет падать
асинхронный метод
метод синхронизации
источник
DispatchQueue.main.sync
Серийная очередь:
Параллельная очередь:
источник
Для Swift 3
источник
источник
Обновление для Swift 5
Из документации Apple :
параметры
метка
Метка строки, прикрепляемая к очереди, чтобы однозначно идентифицировать ее в инструментах отладки, таких как «Инструменты», «Образцы», «Стеки» и отчеты о сбоях. Поскольку приложения, библиотеки и платформы могут создавать свои собственные очереди отправки, рекомендуется стиль именования обратного DNS (com.example.myqueue). Этот параметр является необязательным и может иметь значение NULL.
QoS
Уровень качества обслуживания для связи с очередью. Это значение определяет приоритет, при котором система планирует задачи для выполнения. Список возможных значений см. В разделе DispatchQoS.QoSClass.
атрибуты
Атрибуты, связанные с очередью. Включите параллельный атрибут для создания очереди отправки, которая выполняет задачи одновременно. Если этот атрибут не указан, очередь отправки выполняет задачи последовательно.
autoreleaseFrequency
Частота автоматического высвобождения объектов, созданных блоками, запланированными для очереди. Список возможных значений см . В разделе DispatchQueue.AutoreleaseFrequency .
цель
Целевая очередь для выполнения блоков. Укажите DISPATCH_TARGET_QUEUE_DEFAULT, если вы хотите, чтобы система предоставила очередь, подходящую для текущего объекта.
источник
теперь это просто:
по умолчанию используется последовательный, чтобы получить параллелизм, используйте аргумент необязательных атрибутов .concurrent
источник
seiralQueue.async {}
. @tylemolисточник
Вы можете создать очередь отправки, используя этот код в Swift 3.0
источник