我有以下从服务器下载图像的功能;
func getImageFromServerById(imageId: String) -> UIImage? {
let url:String = "https://dummyUrl.com/\(imageId).jpg"
var resultInNSDataformat: NSData!
let task = NSURLSession.sharedSession().dataTaskWithURL(NSURL(string: url)!) {(data, response, error) in
if (error == nil){
resultInNSDataformat = data
}
}
task.resume()
return UIImage(data: resultInNSDataformat)
}
该函数不等待下载任务完成就返回图像。因此我的应用程序总是崩溃。关于如何等待下载有什么想法吗?
最佳答案
另一个答案并不能很好地替代您已有的代码。更好的方法是继续使用 NSURLSession 的数据任务来保持下载操作异步,并向该方法添加您自己的回调 block 。您需要了解,在从方法返回之前,下载任务 block 的内容不会被执行。只需查看对resume() 的调用位置即可获得进一步的证据。
相反,我推荐这样的东西:
func getImageFromServerById(imageId: String, completion: ((image: UIImage?) -> Void)) {
let url:String = "https://dummyUrl.com/\(imageId).jpg"
let task = NSURLSession.sharedSession().dataTaskWithURL(NSURL(string: url)!) {(data, response, error) in
completion(image: UIImage(data: data))
}
task.resume()
}
可以这样调用
getImageFromServerById("some string") { image in
dispatch_async(dispatch_get_main_queue()) {
// go to something on the main thread with the image like setting to UIImageView
}
}
关于swift - 函数不会等到数据下载完毕,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30959200/