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

212

在我的应用程序中,我有一个函数,它创建了一个NSRURLSession并使用它发送了一个NSURLRequest。

sesh.dataTaskWithRequest(req, completionHandler: {(data, response, error)
在这个任务的完成块中,我需要进行一些计算,将UIImage添加到调用的视图控制器中。我有一个名为的函数
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"到这个函数调用中。我该怎么做呢?或者有人能建议一种最佳的方法来添加一个方法调用到应用程序的主队列吗?

11个回答

0
对于现代的Swift代码(Swift 5.5+和iOS 13+),苹果建议使用Main Actor而不是GCD来执行主线程任务,以获得更清晰、高效和安全的代码。
我已经详细概述了使用actors调度到主线程的4种方法在这里
最简单的方法是使用@MainActor属性包装器注释相关方法。
@MainActor func callFunctionOnMainThread(paramOne: Int, paramTwo: String) {
    // We can now access parameters on the main thread
}

我们使用结构化并发,即 async/await

await callFunctionOnMainThread(paramOne: 2, paramTwo: "Two")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接