我具有以下从服务器下载图像的功能;
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的数据任务,以保持下载操作异步,并向该方法添加您自己的回调块。从方法返回之前,您需要了解下载任务块的内容未执行。只需查看对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 } }