In my app I have a function that makes an NSRURLSession and sends out an NSURLRequest using
sesh.dataTaskWithRequest(req, completionHandler: {(data, response, error)
In the completion block for this task, I need to do some computation that adds a UIImage to the calling viewcontroller. I have a func called
func displayQRCode(receiveAddr, withAmountInBTC:amountBTC)
that does the UIImage-adding computation. If I try to run the view-adding code inside of the completion block, Xcode throws an error saying that I can't use the layout engine while in a background process. So I found some code on SO that tries to queue a method on the main thread:
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)
})
However, I don't know how to add the parameters "receiveAddr" and "amountBTC" to this function call. How would I do this, or can someone suggest an optimal way for adding a method call to the application's main queue?
Modern versions of Swift use DispatchQueue.main.async
to dispatch to the main thread:
DispatchQueue.main.async {
// your code here
}
To dispatch after on the main queue, use:
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
// your code here
}
Older versions of Swift used:
dispatch_async(dispatch_get_main_queue(), {
let delegateObj = UIApplication.sharedApplication().delegate as YourAppDelegateClass
delegateObj.addUIImage("yourstring")
})