我正在尝试使用异步块将图像从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。如果我将相同的代码分配给按钮,它可以正常工作,并显示图像。任何帮助表示赞赏。
答案 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
}