S. *_*lin 2 uitableview ios swift alamofire
我有一个带有动态单元格的tableView.每个单元格都有一个imageView和一个textLabel.顺便说一句,我正在与Alamofire和AlamofireImage合作.我的问题是,第一个单元格(如果视图确实出现,您会看到)不会显示图像.但如果我向下滚动,我会看到其他细胞的图像.如果再次向上滚动,第一个单元格的图像也会出现.
首先,我在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)TableView计算用户并重新加载自身.
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return users?.count ?? 0
}
Run Code Online (Sandbox Code Playgroud)在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)
但是没有什么变化......我已经尝试了很多但看起来类似的问题却无法解决它...我希望你能给我一些提示或更好的解决方案!:)
提前致谢
我想通过发布步骤(在这种情况下遵循的最佳做法)给你一个指示:
步骤1:只要您从服务器获得图像URL,就可以在后台获取图像.我更喜欢在操作队列中这样做,我同时下载多个图像.你可以编写一个辅助类,它接受一个完成块并实现NSOperation/ NSOperationQueue.
步骤2:在下载图像时,对于用户的眼睛,在图像视图上放置加载覆盖图.你可以这样做cellForRowAtIndexPath:.
第3步:图像可用后,将它们缓存在文件系统中.这是为了避免任何滚动突然的行为.
第4步:图像可用后,调用完成块.
步骤5: 在完成块中,在主线程上重新加载表.确保cellForRowAtIndexPath:首先检查缓存中的图像(如果存在),如果不存在则显示加载覆盖,如果图像提取正在进行中.如果图像在缓存中不可用且下载也未进行,则显示一些默认图像.
| 归档时间: |
|
| 查看次数: |
1895 次 |
| 最近记录: |