Как использовать потоки в Swift?
dispatchOnMainThread:^{
NSLog(@"Block Executed On %s", dispatch_queue_get_label(dispatch_get_current_queue()));
}];
ios
swift
multithreading
dispatch-queue
Anshul
источник
источник
]
перед точкой с запятой в последней строке?DispatchQueue.global(qos: .background).async { print("Run on background thread") DispatchQueue.main.async { print("We finished that.") // only back on the main thread, may you access UI: label.text = "Done." } }
Ответы:
Swift 3.0+
Многое было модернизировано в Swift 3.0. Запуск чего-либо в фоновом потоке выглядит следующим образом:
Свифт с 1.2 по 2.3
Pre Swift 1.2 - Известная проблема
Начиная с Swift 1.1 Apple не поддерживала вышеуказанный синтаксис без некоторых модификаций. Передача на
QOS_CLASS_BACKGROUND
самом деле не работает, вместо этого используйтеInt(QOS_CLASS_BACKGROUND.value)
.Для получения дополнительной информации см. Документацию Apple.
источник
Async.background {}
Рекомендуется определить функцию многократного использования, к которой можно обращаться несколько раз.
ВОЗМОЖНАЯ ФУНКЦИЯ:
например, где-то вроде AppDelegate.swift в качестве глобальной функции.
Примечание: в Swift 2.0 замените QOS_CLASS_USER_INITIATED.value выше на QOS_CLASS_USER_INITIATED.rawValue вместо
ИСПОЛЬЗОВАНИЕ:
A. Чтобы запустить процесс в фоновом режиме с задержкой в 3 секунды:
Б. Чтобы запустить процесс в фоновом режиме, затем выполнить завершение на переднем плане:
C. Для задержки на 3 секунды - обратите внимание на использование параметра завершения без параметра фона:
источник
if(background != nil){ background!(); }
сbackground?()
на несколько swiftier синтаксис?DispatchQueue.global(priority: Int(DispatchQoS.QoSClass.userInitiated.rawValue)).async {
но это выдает ошибку какcannot invoke initializer for type 'Int' with an argument list of type '(qos_class_t)'
. Рабочее решение находится здесь (DispatchQueue.global(qos: DispatchQoS.QoSClass.userInitiated).async
).Ответ Дана Болье в swift5 (также работает с swift 3.0.1).
Swift 5.0.1
использование
источник
background
закрытии очень, очень, очень долго (~ = бесконечно). Этот метод рассчитан на конечное время: время, необходимое для выполнения фоновой работы. Таким образом,completion
замыкание будет вызвано, как только пройдет время выполнения фоновой работы + задержка.Версия Swift 3
Swift 3 использует новый
DispatchQueue
класс для управления очередями и потоками. Для запуска чего-либо в фоновом потоке вы должны использовать:Или, если вы хотите что-то в две строки кода:
В этом руководстве вы также можете получить подробную информацию о GDC в Swift 3 .
источник
От Jameson Quave в руководстве
Swift 2
источник
В Swift 4.2 и Xcode 10.1
У нас есть три типа очередей:
1. Основная очередь: Главная очередь - это последовательная очередь, которая создается системой и связана с основным потоком приложения.
2. Глобальная очередь: Глобальная очередь - это параллельная очередь, которую мы можем запросить относительно приоритета задач.
3. Пользовательские очереди: могут быть созданы пользователем. Настраиваемые параллельные очереди всегда отображаются в одну из глобальных очередей путем указания свойства Quality of Service (QoS).
Все эти очереди могут быть выполнены двумя способами
1. Синхронное исполнение
2. Асинхронное выполнение
Из AppCoda: https://www.appcoda.com/grand-central-dispatch/
источник
.background
QoS,.userInitiated
но у меня все получилось.background
Swift 4.x
Поместите это в какой-нибудь файл:
а затем позвоните туда, где вам нужно:
источник
Вы должны отделить изменения, которые вы хотите запустить в фоновом режиме, от обновлений, которые вы хотите запустить в пользовательском интерфейсе:
источник
dispatch_async(dispatch_get_main_queue()) { // update some UI }
вызывается, когда выполняется фоновый оператор (Outer Block)?Хорошие ответы , хотя, в любом случае я хочу поделиться моим объектно - ориентированным решением вплоть до настоящего времени для стрижа 5 .
пожалуйста, проверьте это: AsyncTask
Концептуально вдохновленный Android AsyncTask, я написал свой собственный класс в Swift
AsyncTask позволяет правильно и легко использовать поток пользовательского интерфейса. Этот класс позволяет выполнять фоновые операции и публиковать результаты в потоке пользовательского интерфейса.
Вот несколько примеров использования
Пример 1 -
Пример 2 -
Имеет 2 общих типа:
BGParam
- тип параметра, отправляемого заданию при выполнении.BGResult
- тип результата фонового вычисления.Когда вы создаете AsyncTask, вы можете добавить эти типы к тому, что вам нужно передать в фоновую задачу и из нее, но если вам не нужны эти типы, вы можете пометить его как неиспользуемый, просто установив его в:
Void
или с более коротким синтаксисом:()
Когда асинхронная задача выполняется, она проходит 3 этапа:
beforeTask:()->Void
вызывается в потоке пользовательского интерфейса непосредственно перед выполнением задачи.backgroundTask: (param:BGParam)->BGResult
вызывается в фоновом потоке сразу послеafterTask:(param:BGResult)->Void
вызывается в потоке пользовательского интерфейса с результатом из фоновой задачиисточник
Поскольку на вопрос ОП уже был дан ответ, я просто хочу добавить некоторые соображения по поводу скорости:
Я не рекомендую запускать задачи с приоритетом потока .background, особенно на iPhone X, где задача, кажется, распределена на ядрах с низким энергопотреблением.
Вот некоторые реальные данные из вычислительно интенсивной функции, которая читает из файла XML (с буферизацией) и выполняет интерполяцию данных:
Имя устройства / .background / .utility / .default / .userInitiated / .userInteractive
Обратите внимание, что набор данных не одинаков для всех устройств. Это самый большой на iPhone X и самый маленький на iPhone 5s.
источник
Swift 5
Чтобы упростить задачу, создайте файл «DispatchQueue + Extensions.swift» с этим содержимым:
Использование :
источник
Grand Central Dispatch используется для обработки многозадачности в наших приложениях для iOS.
Вы можете использовать этот код
Для получения дополнительной информации используйте эту ссылку: https://www.programminghub.us/2018/07/integrate-dispatcher-in-swift.html
источник
Многоцелевая функция для потока
Используйте это как:
источник
Мне очень нравится ответ Дэна Болье, но он не работает со Swift 2.2, и я думаю, что мы можем избежать этих отвратительных принудительных развёрток!
источник
источник
в Swift 4.2 это работает.
источник