gpt4 book ai didi

ios - 如何使用回调在 Swift 中进行异步调用,以便主 UI 不会挂起?

转载 作者:可可西里 更新时间:2023-11-01 00:23:49 26 4
gpt4 key购买 nike

我正在尝试进行异步调用(对 Parse),并且在调用期间我希望我的主 UI 挂起。

下面是我试图调用我的 ViewController 的函数。该函数下方是我在 ViewController 中使用的代码。

sleep(4) 行中,ViewController LoginVC 的主 UI 确实卡住了。我没有正确使用异步调用的回调吗?

class Utils {

func logIntoWebService(uname: String, pwd: String, completion: ((result:Bool?) -> Void)!) {

PFUser.logInWithUsernameInBackground(uname, password:pwd) {
(user, error) -> Void in

if error == nil {
if user != nil {
// Yes, User Exists

//UI IS STUCK DURING THIS SLEEP(10)
sleep(10)

completion(result: true)

} else {
completion(result: false)
}
} else {

completion(result: false)

}

}
}

}

我正在从我的 ViewController 调用上述函数。下面是来 self 的 ViewController 的调用

class LoginVC: UIViewController {

var mUtils: Utils = Utils()

mUtils.loggedInStatus({ (result) -> Void in
println("Response from logInToParse = " + String(stringInterpolationSegment: result))

})

}

最佳答案

您混淆了后台线程和完成处理程序。

logInWithUsernameInBackground 是一个在后台运行的异步函数,但是在完成处理程序中运行的所有代码都在主线程中运行:

 completion: ((result:Bool?) -> Void)!) {//The code here runs in the main thread}

所以基本上从您的应用程序开始与 Parse.com 通信开始,直到返回结果,该代码在后台线程中异步运行,当它完成并且您的应用程序收到响应时,它在完成 block 返回在主线程中。

现在假设你真的想在完成 block 的后台运行一些代码,而不是使用类似的东西:

let qualityOfServiceClass = QOS_CLASS_BACKGROUND
let backgroundQueue = dispatch_get_global_queue(qualityOfServiceClass, 0)
dispatch_async(backgroundQueue, {
println("Now this code will run in the background thread")
})

所有新的服务质量等级是:

QOS_CLASS_USER_INTERACTIVE
QOS_CLASS_USER_INITIATED
QOS_CLASS_UTILITY
QOS_CLASS_BACKGROUND

或者在你的情况下:

PFUser.logInWithUsernameInBackground(uname, password:pwd) {
(user, error) -> Void in
if error == nil {
if user != nil {
// Yes, User Exists

let qualityOfServiceClass = QOS_CLASS_BACKGROUND
let backgroundQueue = dispatch_get_global_queue(qualityOfServiceClass, 0)
dispatch_async(backgroundQueue, {
sleep(10)
})
completion(result: true)

} else {
completion(result: false)
}
} else {

completion(result: false)
}
}

有关详细信息,请参阅 Apple documentation

关于ios - 如何使用回调在 Swift 中进行异步调用,以便主 UI 不会挂起?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31064213/

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