gpt4 book ai didi

swift - 从 URLSession 中获取接收到的数据的方法是什么?

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

最近,我尝试编写自己的 Telegram Bot API .然而,该项目似乎遇到了 URLSession(以前称为 NSURLSession)问题。

调用结构如下:

getMe() -> getData() -> NSURLSession

理想情况下,我希望将 NSURLSession 返回的数据传递回 getMe() 以供应用程序处理。然而,这在我尝试过的方法中并没有被证明是可行的。

下面是我一直在使用的代码。 syntheseURL() 生成应用应该打开 session 的 URL,以便在 Telegram Bot API 上执行操作。 syntheseURL() 生成的 URL 模板是 https://api.telegram.org/bot\(token)/\(tgMethod)

// NSURLSession getData: gets data from Telegram Bot API
func getData(tgMethod: String, arguments: [String] = [String](), caller: String = #function) {
let url = synthesiseURL(tgMethod: "getMe"), request = NSMutableURLRequest(url: url)

var receivedData = String()

let session = URLSession.shared.dataTask(with: request as URLRequest) { data, response, err in

if err != nil {print(err!.localizedDescription); return}

DispatchQueue.main.async {
receivedData = String(data: data!, encoding: String.Encoding.nonLossyASCII)!
print(receivedData)
}
}

session.resume()
}

我一直在尝试让 getData 将包含 Bot API 响应的 receivedData 传递回函数 getMe

func getMe() -> String {
HTTPInterface(botToken: token).get(tgMethod: "getMe")
return [???] // here's where the data from getData() should come
}

我尝试了完成处理程序、回调、对主线程的异步调用等,但似乎都没有按预期工作(getMe() 返回一个空字符串)。

为什么会这样,能否解决?

最佳答案

根本问题是您的 getMe() 函数被声明为具有立即 String 返回类型,但它依赖于延迟/异步调用来获取该字符串.时间轴看起来像这样:

  1. getMe() 被一些客户端代码调用
  2. getMe() 启动启动 URLSession 以获取数据的方法
  3. getMe() 移至下一行执行并返回一个字符串(此时仍为空)。 getMe() 函数现已返回,客户端代码执行继续向前,String 结果为空
  4. URLSession 以数据完成,但执行已经继续,因此数据不会在任何地方使用

最简单的修复方法是让您的 getMe 函数没有返回类型,但在 URLSession 数据返回时也回调闭包参数,例如:

func getMe(callback:String->()) {
//getData and pass a closure that executes the callback closure with the String data that comes back
}

不太容易解决的方法是使用分派(dispatch)信号量之类的技术来防止 getMe() 在返回 URLSession 数据之前返回结果。但这种方法可能会拖延您的主线程,不太可能是正确的选择。

关于swift - 从 URLSession 中获取接收到的数据的方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39019978/

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