gpt4 book ai didi

Swift:URLSession 完成处理程序

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

我正在尝试使用一段在 Xcode playground 文件中工作的代码从本地服务器获取一些数据:

       URLSession.shared.dataTask(with: url!, completionHandler: {(data, response, error) -> Void in


if let jsonObj = try? JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? NSDictionary {
friend_ids = (jsonObj!.value(forKey: "friends") as? NSArray)!
}

}).resume()

return friend_ids

阅读了关于该主题的一些类似问题后,我知道 URLSession 是异步运行的,因此该函数在从服务器获取任何数据之前返回 nil 值。我还认为我理解完成处理程序可用于确保在继续之前实际获取数据,但不幸的是我无法真正理解如何实现它。有人能告诉我如何在这个简单的示例中使用完成处理程序,以确保在返回变量之前从服务器获取吗?

谢谢!

最佳答案

如果您有一个函数本身在执行异步工作,则它不能有表示该异步工作结果的返回值(因为函数返回是立即的)。因此,做异步工作的函数必须以一个闭包作为参数,它接受预期的结果,并在异步工作完成时被调用。因此,对于您的代码:

func getFriendIds(completion: @escaping (NSArray) -> ()) {
URLSession.shared.dataTask(with: url!, completionHandler: {(data, response, error) -> Void in
if let jsonObj = try? JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? NSDictionary {
friend_ids = (jsonObj!.value(forKey: "friends") as? NSArray)!
completion(friend_ids) // Here's where we call the completion handler with the result once we have it
}
}).resume()
}

//USAGE:

getFriendIds(completion:{
array in
print(array) // Or do something else with the result
})

关于Swift:URLSession 完成处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48016242/

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