gpt4 book ai didi

Swift:阻止所有代码,直到函数完成执行

转载 作者:行者123 更新时间:2023-11-30 10:01:43 25 4
gpt4 key购买 nike

我正在调用一个从服务中获取关键数据的函数。我希望所有代码都等到这种情况发生为止。我尝试使用信号量,但它似乎没有按预期工作。我的代码是这样的:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
getUserById(userIDParam)
thisShouldWait()
....

func getUserById(id: Int) -> Void {
let semaphore = dispatch_semaphore_create(0)
WebService.getUserById(id) { user in
AppDelegate.CurrentUser = user
}
}

函数:thisShouldWait() 在完成处理程序完成之前执行。所以我尝试使用信号量,但它无限期地运行。解决办法是什么?我的服务器 getUserById:

class func getUserById(userID: Int, completionHandler: (User) -> Void) -> Void {

let semaphore = dispatch_semaphore_create(0)
let defaultSession = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration())

let methodParameters = []

let url = appDelegate.URL

let dataTask: NSURLSessionDataTask = defaultSession.dataTaskWithURL(url, completionHandler: {(data, response, error) -> Void in

if error != nil {
} else if let httpResponse = response as? NSHTTPURLResponse {
if httpResponse.statusCode >= 200 || httpResponse.statusCode <= 299 {
let user: User = parseSearchResults(data)
completionHandler(user)
}
}
})

dataTask.resume()

dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER)
}

最佳答案

您的完成处理程序中缺少 dispatch_semaphore_signal:

let dataTask: NSURLSessionDataTask = defaultSession.dataTaskWithURL(url) { data, response, error in
if error != nil {
} else if let httpResponse = response as? NSHTTPURLResponse {
if httpResponse.statusCode >= 200 || httpResponse.statusCode <= 299 {
let user: User = parseSearchResults(data)
completionHandler(user)
}
}
dispatch_semaphore_signal(semaphore) // Added
}

确保在后台线程上调用 getUserById。在完成操作时锁定 UI 从来都不是一个好主意。

关于Swift:阻止所有代码,直到函数完成执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38151642/

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