在Swift中如何调用带有GCD主线程参数的方法?

在我的应用程序,我有一个函数,使一个NSRURLSession并发出一个NSURLRequest使用

sesh.dataTaskWithRequest(req, completionHandler: {(data, response, error) 

在这个任务的完成块中,我需要做一些计算,将UIImage添加到调用viewcontroller。 我有一个func叫

 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”。 我该怎么做,或者可以有人build议一个方法调用添加到应用程序的主要队列的最佳方式?

只需在completion handler编写此代码即可。无需使用dispatch_after

  dispatch_async(dispatch_get_main_queue(),{ let delegateObj = UIApplication.sharedApplication().delegate as YourAppDelegateClass delegateObj.addUIImage("yourstring") }) 

Swift 3:

 DispatchQueue.main.async { let delegateObj = UIApplication.sharedApplication().delegate as YourAppDelegateClass delegateObj.addUIImage("yourstring") } 

也用于主队列之后分派

 DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { // your code here } 

用你的委托类replaceYourAppDelegateClass

Swift 3版本:

 DispatchQueue.main.async { print("Hello") } 

Swift 2

使用追踪闭锁,这变成:

 dispatch_async(dispatch_get_main_queue()) { self.tableView.reloadData() } 

拖尾闭包是Swift语法糖,它可以在函数参数范围之外定义闭包。 欲了解更多信息,请参阅Swift 2.2编程语言指南中的尾随闭包 。

在dispatch_async的情况下,API是func dispatch_async(queue: dispatch_queue_t, _ block: dispatch_block_t)因为dispatch_block_t() -> Voidtypes别名() -> Void – 一个闭包接收0个参数,没有返回值,block是最后一个参数的函数,我们可以在dispatch_async的外部范围中定义闭包。

以下是更好的(IMO)Swifty / Cocoa风格的语法来达到与其他答案相同的结果:

 NSOperationQueue.mainQueue().addOperationWithBlock({ // Your code here }) 

或者你可以抓住stream行的asynchronousSwift库来获得更less的代码和更多的function:

 Async.main { // Your code here } 

正确的做法是在main_queue中使用dispatch_async,就像我在下面的代码中所做的那样

 dispatch_async(dispatch_get_main_queue(), { (self.delegate as TBGQRCodeViewController).displayQRCode(receiveAddr, withAmountInBTC:amountBTC) }) 

如果你在closures的时候使用自己,不要忘记减弱自己。

 dispatch_async(dispatch_get_main_queue(),{ [weak self] () -> () in if let strongSelf = self { self?.doSomething() } }) 

下面是一个很好的小全局函数,你可以添加一个更好的语法:

 func dispatch_on_main(block: dispatch_block_t) { dispatch_async(dispatch_get_main_queue(), block) } 

和用法

 dispatch_on_main { // Do some UI stuff }