В моем приложении у меня есть функция, которая создает NSRURLSession и отправляет NSURLRequest, используя
sesh.dataTaskWithRequest(req, completionHandler: {(data, response, error)
В блоке завершения для этой задачи мне нужно выполнить некоторые вычисления, которые добавляют UIImage к вызывающему viewcontroller. У меня есть функция под названием
func displayQRCode(receiveAddr, withAmountInBTC:amountBTC)
это делает вычисление добавления UIImage. Если я пытаюсь запустить код добавления представления внутри блока завершения, XCode выдает ошибку, говорящую, что я не могу использовать механизм компоновки в фоновом процессе. Итак, я нашел код на SO, который пытается поставить метод в очередь в главном потоке:
let time = dispatch_time(DISPATCH_TIME_NOW, Int64(0.0 * Double(NSEC_PER_MSEC)))
dispatch_after(time, dispatch_get_main_queue(), {
let returned = UIApplication.sharedApplication().sendAction("displayQRCode:", to: self.delegate, from: self, forEvent: nil)
})
Однако я не знаю, как добавить параметры "receiveAddr" и "amountBTC" к этому вызову функции. Как мне это сделать, или кто-то может предложить оптимальный способ добавления вызова метода в основную очередь приложения?
Версия Swift 3+ и Swift 4:
Swift 3 и Xcode 9.2:
источник
Swift 2
Используя замыкающие замыкания это становится:
Trailing Closures - это синтаксический сахар Swift, который позволяет определять замыкание вне области действия параметра функции. Для получения дополнительной информации см. Trailing Closures в Руководстве по языку программирования Swift 2.2.
В случае dispatch_async API , это
func dispatch_async(queue: dispatch_queue_t, _ block: dispatch_block_t)
такdispatch_block_t
это псевдоним типа для() -> Void
- A закрытия , которая получает параметры 0 и не имеет возвращаемое значения, и блока является последним параметром функции мы можем определить замыкание во внешней сфереdispatch_async
.источник
Перезагрузить коллекциюПосмотреть на главной теме
источник
Вот более приятный (IMO) синтаксис стиля Swifty / Cocoa для достижения того же результата, что и в других ответах:
Или вы можете воспользоваться популярной библиотекой Async Swift для еще меньшего количества кода и большей функциональности:
источник
OperationQueue.main.addOperation({ }
Правильный способ сделать это - использовать dispatch_async в main_queue, как я делал в следующем коде
источник
Вот хорошая маленькая глобальная функция, которую вы можете добавить для лучшего синтаксиса:
И использование
источник
источник
Не забудьте ослабить себя, если вы используете себя внутри замыкания.
источник