我已经为这个错误苦苦挣扎了几天...... 所以我有一个函数应该从在线 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/