ContentsOfURL从完全有效的URL返回swift 2.0中的nil

时间:2016-04-01 10:02:28

标签: ios swift uiimageview nsdata

我正在尝试从URL获取图像,但contentsOfURL方法保持返回nil。该网址是合法的,只有一张图片。 我已经尝试了dispatch_get_global_queue方法以及下面描述的方法。无论我运行多少次,NSData值总是为零。我已经尝试过重启模拟器了。网络也很快,网络也没有问题。 这是代码失败的部分

var imageURL : NSURL(string : "https://www.nasa.gov/sites/default/files/wave_earth_mosaic_3.jpg")

if let url = imageURL{
        spinner?.startAnimating()
        let request = NSURLRequest(URL: url)
        let task = NSURLSession.sharedSession().dataTaskWithRequest(request){(data,response,error) -> Void in
            self.imageData = NSData(contentsOfURL: url)
        }
            dispatch_async(dispatch_get_main_queue()){
                if url == self.imageURL{
                    self.image = UIImage(data: self.imageData!)
                }
                else{

                }
        }
        task.resume()
    }

1 个答案:

答案 0 :(得分:0)

这是你的功能应该是这样的。不需要GCD。 如{strong> Eric D 所述,let task = ....NSData(contentsOfURL: url)也无需再次下载图片。

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        var imageURL = "https://www.nasa.gov/sites/default/files/wave_earth_mosaic_3.jpg"

        loadImage(fromUrl: imageURL) { (image, error) in
            if let image = image {
                print("got an image")
            } else {
                print("got an error")
            }
        }
    }

    // pretty function that takes a string and a callback
    // it sends either an image or an error back through the callback
    func loadImage(fromUrl urlString: String, completion:(image:UIImage?,error:NSError?) -> Void) {

        guard let url = NSURL(string:urlString) else {
            // invalid url
            completion(image: nil,error: nil)
            return
        }

        let request = NSURLRequest(URL: url)
        NSURLSession.sharedSession().dataTaskWithRequest(request) { (data, response, error) in

            if let error = error {
                completion(image: nil,error: error)
                return
            }

            guard let data = data, image = UIImage(data:data) else {
                // no connection error, but no image extracted from data
                return completion(image: nil, error: nil)
            }

            completion(image: image, error: nil)
        }.resume()
    }
}