gpt4 book ai didi

ios - Swift:URLSession.shared.downloadTask 仅在模拟器中工作

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

我已经为这个错误苦苦挣扎了几天......所以我有一个函数应该从在线 txt 文件下载一些数据然后返回它。奇怪的是,当我在模拟器中尝试或者连接我的 iPhone 并在那里下载时,它完全有效。但是一旦我开始在 TestFlight 中测试它,这个功能就根本不起作用了。

这是函数代码:

public static func loadSomeData() -> String {
let url = URL(string: "https://myurl.com/file.txt")!
var input = ""

let task = URLSession.shared.downloadTask(with: url) { localURL, urlResponse, error in
if let localURL = localURL {
if let string = try? String(contentsOf: localURL) {
input = string
}
}
}

task.resume()

while !input.isEmpty {
// Waits until the data is loaded
}

return input
}

此外,虽然地址是 HTTPS,但我仍然允许在 plist 文件中任意加载。

非常感谢您的宝贵时间和正手可能的答案!

最佳答案

正如 David S 所说,你不想做这样的繁忙循环。您需要做的是传入一个完成处理程序并让网络请求异步运行。像这样的事情应该可以解决问题。

class Loader {

enum Error: Swift.Error {
case badURL
case badData
case other(Swift.Error)
}

public func loadSomeData(then block: @escaping(Result<String, Error>) -> Void) {
let url = URL(string: "https://www.w3.org/TR/PNG/iso_8859-1.txt")!

let task = URLSession.shared.downloadTask(with: url) { localURL, urlResponse, error in

guard error == nil else {
block(.failure(.other(error!)))
return
}

guard let localURL = localURL else {
block(.failure(.badURL))
return
}

guard let string = try? String(contentsOf: localURL) else {
block(.failure(.badData))
return
}

block(.success(string))
}

task.resume()
}
}

然后你就可以这样做来获取你需要的任何数据。

let loader = Loader()
loader.loadSomeData { result in
switch result {
case .success(let string):
print("SUCCESS: \(string)")
case .failure(let error):
print("ERROR: \(error)")
}
}

关于ios - Swift:URLSession.shared.downloadTask 仅在模拟器中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59146156/

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