我有一个UITableView
,我使用cellForRowAtIndexPath:
函数下载特定单元格的图像。图像下载是异步执行的,并在很短的时间后完成,并在完成后调用完成块。我将单元格内容设置为完成块内的下载图像,但直到用户完成滚动后才会更新。我知道原因是代码应该在NSRunLoopCommonModes
中运行,但在这种情况下我不知道如何做到这一点,任何帮助都表示赞赏。
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
{
let dequeued = self.tableView.dequeueReusableCellWithIdentifier(imageFileCellIdentifier)
let cell = dequeued as! ImageTableViewCell
source.FetchImage(imageLocation, completion: { (image) in
dispatch_async(dispatch_get_main_queue(), {
cell.previewImage.image = image
cell.previewImage.contentMode = .ScaleAspectFill
}
})
}
答案 0 :(得分:1)
试试这个
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
{
let dequeued = self.tableView.dequeueReusableCellWithIdentifier(imageFileCellIdentifier)
let cell = dequeued as! ImageTableViewCell
source.FetchImage(imageLocation, completion: { (image) in
dispatch_async(dispatch_get_main_queue(), { () -> Void in
cell.previewImage.image = image
cell.previewImage.contentMode = .ScaleAspectFill
})
})
}
答案 1 :(得分:0)
UI必须在主线程中更新
你可以使用这样的东西来更新imageView - coz异步完成块可能不会在主线程内调用。
dispatch_async(dispatch_get_main_queue(), {
cell.previewImage.image = image
cell.previewImage.contentMode = .ScaleAspectFill
}
更新用户界面
如果您检查要更新的单元格是否正确,也会更好。因为当下载完成(异步)时,单元格可能会滚出视图,并且该单元格可能会被分配给另一行。在这种情况下,您将图像设置为错误的单元格。
例如
if cell.imageName == 'downloaded_image_name' {
// do update
}