来自URL的UIImage没有出现在Swift中的异步块中

时间:2014-09-07 23:37:54

标签: ios swift uiimage

我正在尝试使用异步块将图像从url设置为UIImage。我目前有一个模型类,它是我构建的API的包装器,它返回图像的url。我的View Controller的viewDidLoad函数调用我的API模型类中的方法,然后,API模型类找到url并从我的View Controller调用委托方法,打印如下:

    func didReceiveNearPeopleResults(results: NSDictionary) {
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), {
        var full_url = "http://s3-us-west-2.amazonaws.com/fake/112.jpg"
        var url = NSURL.URLWithString(full_url)
        var err: NSError?
        var request: NSURLRequest = NSURLRequest(URL: url)
        var urlConnection: NSURLConnection = NSURLConnection(request: request, delegate: self)
        var image: UIImage?
        NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue(), completionHandler: {(response: NSURLResponse!, data: NSData!, error: NSError!) -> Void in

            var imgData = NSData(contentsOfURL: url)
            image = UIImage(data: data)
            self.picture.image = image

        })

    })


}

但是,应用运行时,我的视图中的“图片”不会更新。出于调试目的,我硬编码应该在图像中的URL。如果我将相同的代码分配给按钮,它可以正常工作,并显示图像。任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:1)

你的代码中有几个问题,所以我不清楚你要做什么。 sendAsynchronousRequest是获取图像所需的全部内容。由于该方法是异步的,因此不需要dispatch_async调用。您还有另外两个不需要的呼叫 - 您设置了NSURLConnection,然后不再使用它。您还有dataWithContentsOfURL:,但您也没有做任何事情。您的代码应该简化为,

func didReceiveNearPeopleResults(results: NSDictionary) {
        var full_url = "http://s3-us-west-2.amazonaws.com/fake/112.jpg"
        var url = NSURL.URLWithString(full_url)
        var image: UIImage?
        var request: NSURLRequest = NSURLRequest(URL: url)
        NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue(), completionHandler: {(response: NSURLResponse!, data: NSData!, error: NSError!) -> Void in
            image = UIImage(data: data)
            self.picture.image = image

        })
    }

如果这不起作用,那么你应该在方法中记录一下,以确保它甚至被调用。您的代码在按钮操作方法中工作但不在此处,这意味着可能没有调用此委托方法。

答案 1 :(得分:1)

尝试在主队列中设置图像:

 ...
 image = UIImage(data: data)

 dispatch_async(dispatch_get_main_queue()) {
    self.picture.image = image
 }