gpt4 book ai didi

ios - 完成处理程序调用两次(带线程)

转载 作者:行者123 更新时间:2023-11-28 11:29:50 25 4
gpt4 key购买 nike

我目前正在 Xcode 10 playground (Swift 5) 中测试此代码:

func one() {
let test = "bla"
two(test, completion: { (returned) in
print(returned)
})
}

func two(_ test: String, completion: @escaping (_ returned: String?) -> Void) {
DispatchQueue.global(qos:.background).async {
if !test.isEmpty {
//Some slow stuff
DispatchQueue.main.async {
return completion("hi!")

}
}

//Also some slow stuff
DispatchQueue.main.async {
return completion(nil) //can't have this in "else"!
}
}
}

one()

问题是“hi”和“nil”都被打印了。

如果我摆脱线程,它工作正常,但它似乎在第一个有机会返回之前到达第二个 DispatchQueue.main.async

在我的实际代码中的“一些慢东西”if 中还有很多东西在进行,但我不能依赖它在第二次返回被调用之前花足够长的时间返回。

我如何实现这一点:让函数在后台线程中运行,但在主线程中只返回一次(就像没有线程的代码通常会那样)?

最佳答案

我相信您的目标是只调用一次 completion 处理程序,当您调用时就完成了。在这种情况下,在主线程上排队完成调用后,在 .background 线程中调用 return:

func two(_ test: String, completion: @escaping (_ returned: String?) -> Void) {
DispatchQueue.global(qos:.background).async {
if !test.isEmpty {
//Some slow stuff

// notify main thread we're done
DispatchQueue.main.async {
completion("hi!")
}

// we are done and don't want to do more work on the
// background thread
return
}

//Also some slow stuff
DispatchQueue.main.async {
completion(nil)
}
}
}

关于ios - 完成处理程序调用两次(带线程),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57161987/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com