异步下载后,在可见的UITableviewCell中设置图像

S. *_*lin 2 uitableview ios swift alamofire

我有一个带有动态单元格的tableView.每个单元格都有一个imageView和一个textLabel.顺便说一句,我正在与Alamofire和AlamofireImage合作.我的问题是,第一个单元格(如果视图确实出现,您会看到)不会显示图像.但如果我向下滚动,我会看到其他细胞的图像.如果再次向上滚动,第一个单元格的图像也会出现.

  1. 首先,我在viewDidLoad方法中下载用户数据.完成此操作后,我使用tableView.reloadData()更新tableview.

    override func viewDidLoad() {
        super.viewDidLoad()
        MYRequest_getUsers(//...
            ,
            success: {response -> Void in
                self.users = response
                dispatch_async(dispatch_get_main_queue(),{
                    self.tableView.reloadData()
                })
            },
            failure: {NSError -> Void in
            debugPrint(NSError)
        })
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. TableView计算用户并重新加载自身.

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return users?.count ?? 0
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 在tableView_cellForRowAtIndexPath方法中,我使用用户数据填充单元格.

    let cell = tableView.dequeueReusableCellWithIdentifier(self.identifier) as! UserCell
    
    cell.userNameLabel.tag = indexPath.row
    
    let rowData: User = self.users?[cell.userNameLabel.tag] as User!
    
    cell.userNameLabel.text = rowData.getName()
    
    let avatarURL = rowData.getAvatarURL() ?? ""
    
    cell.userImageView.af_setImageWithURL(imgURL, placeholderImage: placeholderImage)
    
    return cell
    
    Run Code Online (Sandbox Code Playgroud)

我的想法是,在加载用户数据后,tableView开始绘制自己并放置名称(因为它已经在userData中).但是图像是异步下载的(我猜),所以它们在延迟一段时间之后来自后端并且已经绘制了tableView.上下滚动后,我看到了它们.

我想打开屏幕而不上下滚动.Tableview应在加载后自动设置图像.所以我想做一个回调并使用而不是

    cell.userImageView.af_setImageWithURL(imgURL, placeholderImage: placeholderImage)
Run Code Online (Sandbox Code Playgroud)

这个

    Alamofire.request(.GET, avatarURL)
        .responseImage { response in
            cell.userImageView.image = response.2.value
            dispatch_async(dispatch_get_main_queue(), { () -> Void in
                tableView.setNeedsLayout()
            })
    }
Run Code Online (Sandbox Code Playgroud)

但是没有什么变化......我已经尝试了很多但看起来类似的问题却无法解决它...我希望你能给我一些提示或更好的解决方案!:)

提前致谢

Abh*_*nav 5

我想通过发布步骤(在这种情况下遵循的最佳做法)给你一个指示:

步骤1:只要您从服务器获得图像URL,就可以在后台获取图像.我更喜欢在操作队列中这样做,我同时下载多个图像.你可以编写一个辅助类,它接受一个完成块并实现NSOperation/ NSOperationQueue.

步骤2:在下载图像时,对于用户的眼睛,在图像视图上放置加载覆盖图.你可以这样做cellForRowAtIndexPath:.

第3步:图像可用后,将它们缓存在文件系统中.这是为了避免任何滚动突然的行为.

第4步:图像可用后,调用完成块.

步骤5: 在完成块中,在主线程上重新加载表.确保cellForRowAtIndexPath:首先检查缓存中的图像(如果存在),如果不存在则显示加载覆盖,如果图像提取正在进行中.如果图像在缓存中不可用且下载也未进行,则显示一些默认图像.