swift - 函数不会等到数据下载完毕

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

该函数不等待下载任务完成就返回图像。因此我的应用程序总是崩溃。关于如何等待下载有什么想法吗?

最佳答案

另一个答案并不能很好地替代您已有的代码。更好的方法是继续使用 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/

相关文章:

swift - 使用 swift 的 Google Places API Web 服务返回错误 303

swift - 尝试使用 NSURLSession 加载网页

ios - 多个文件下载有问题

ios - 如何在速度慢、连接性差的网络上下载大文件?

ios - 如何使用 NSURLSession 复制 POST 登录

ios - 尝试将值注入(inject)发布者,但接收到无序值

ios - 我无法将数据发送到下一个 UIViewController

ios - 如何在 iOS/swift 中打破断言

swift - 如何检查字典中的值?

ios - HTTP 请求在 swift 中不起作用