在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
是() -> Void
types别名() -> 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 }