Swift URL 响应为零
Swift URL Response is nil
我创建了一个自定义 DataManager class。在其中我想在一个方法中获取数据,然后 return 一个 NSData 对象转换为 JSON。
我尝试使用 completionHandler 获取数据,但没有成功:
class func fetchData() -> NSData? {
var session = NSURLSession.sharedSession(),
result = NSData?()
let DataURL : NSURL = NSURL(string: "http://...file.json")!
let sessionTask = session.dataTaskWithURL(DataURL, completionHandler: { (data: NSData!, response: NSURLResponse!, error: NSError!) -> Void in
result = data
})
sessionTask.resume()
return result
}
dataTask
异步运行。这意味着完成处理程序闭包不会在您从 fetchData
return 时调用。因此,result
尚未设置。
因此,您不应尝试从异步方法同步检索数据。相反,您应该自己使用异步完成处理程序模式:
class func fetchData(completion: @escaping (Data?, Error?) -> Void) {
let session = URLSession.shared
let url = URL(string: "http://...file.json")!
let task = session.dataTask(with: url) { data, response, error in
completion(data, error)
}
task.resume()
}
你会这样称呼它:
MyClass.fetchData { data, error in
guard let data = data, error == nil else {
print(error ?? "Unknown error")
return
}
// use `data` here; remember to dispatch UI and model updates to the main queue
}
// but do not try to use `data` here
...
仅供参考,对于 Swift 3 之前的原始语法,请参阅 previous revision of this answer。
我创建了一个自定义 DataManager class。在其中我想在一个方法中获取数据,然后 return 一个 NSData 对象转换为 JSON。
我尝试使用 completionHandler 获取数据,但没有成功:
class func fetchData() -> NSData? {
var session = NSURLSession.sharedSession(),
result = NSData?()
let DataURL : NSURL = NSURL(string: "http://...file.json")!
let sessionTask = session.dataTaskWithURL(DataURL, completionHandler: { (data: NSData!, response: NSURLResponse!, error: NSError!) -> Void in
result = data
})
sessionTask.resume()
return result
}
dataTask
异步运行。这意味着完成处理程序闭包不会在您从 fetchData
return 时调用。因此,result
尚未设置。
因此,您不应尝试从异步方法同步检索数据。相反,您应该自己使用异步完成处理程序模式:
class func fetchData(completion: @escaping (Data?, Error?) -> Void) {
let session = URLSession.shared
let url = URL(string: "http://...file.json")!
let task = session.dataTask(with: url) { data, response, error in
completion(data, error)
}
task.resume()
}
你会这样称呼它:
MyClass.fetchData { data, error in
guard let data = data, error == nil else {
print(error ?? "Unknown error")
return
}
// use `data` here; remember to dispatch UI and model updates to the main queue
}
// but do not try to use `data` here
...
仅供参考,对于 Swift 3 之前的原始语法,请参阅 previous revision of this answer。