关于 ios:来自 URL 的 UIImage 未出现在 Swift 的异步块中

UIImage from URL not appearing in async block in Swift

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    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。如果我将相同的代码分配给一个按钮,它可以正常工作,并且图像会出现。任何帮助表示赞赏。


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

1
2
3
4
5
6
 ...
 image = UIImage(data: data)

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


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

1
2
3
4
5
6
7
8
9
10
11
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

        })
    }

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