滚动时使用新加载的内容更新UITableview单元格

时间:2016-07-21 03:21:50

标签: swift xcode uitableview nsrunloop

我有一个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
        }
    })
}

2 个答案:

答案 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
}