功能不会等到数据下载完毕

时间:2014-11-29 23:14:45

标签: swift nsurlsession

我有以下从服务器下载图像的功能;

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)
}

在返回图像之前,该功能不会等待下载任务完成。因此我的应用程序总是崩溃。有关如何等待下载的任何想法?

1 个答案:

答案 0 :(得分:18)

另一个答案不是您已有代码的良好替代品。更好的方法是继续使用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
    }
}