gpt4 book ai didi

ios - 异步加载图片不断导致图片闪烁?

转载 作者:行者123 更新时间:2023-11-29 02:01:16 25 4
gpt4 key购买 nike

我为每个 UITableViewCell 都有一个标题 View 。在此 header View 中,我通过 Facebook API 中的异步函数加载了个人图片。但是,由于该函数是异步的,我相信该函数会被多次调用,导致图像不断闪烁。我想解决此问题的方法是首先将 viewDidLoad 中的图像加载到数组中,然后在 UITableViewCell 的 header View 中显示数组内容。但是,由于该功能的异步性质,我在实现此操作时遇到了困难:我似乎无法抓取每张照片,然后继续我的程序。这是我的尝试:

    //Function to get a user's profile picture
func getProfilePicture(completion: (result: Bool, image: UIImage?) -> Void){
// Get user profile pic
let url = NSURL(string: "https://graph.facebook.com/1234567890/picture?type=large")
let urlRequest = NSURLRequest(URL: url!)
//Asynchronous request to display image
NSURLConnection.sendAsynchronousRequest(urlRequest, queue: NSOperationQueue.mainQueue()) { (response:NSURLResponse!, data:NSData!, error:NSError!) -> Void in
if error != nil{
println("Error: \(error)")
}
// Display the image
let image = UIImage(data: data)
if(image != nil){
completion(result: true, image: image)
}
}
}
override func viewDidLoad() {
self.getProfilePicture { (result, image) -> Void in
if(result == true){
println("Loading Photo")
self.creatorImages.append(image!)
}
else{
println("False")
}
}
}

func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
//Show section header cell with image
var cellIdentifier = "SectionHeaderCell"
var headerView = tableView.dequeueReusableCellWithIdentifier(cellIdentifier) as! SectionHeaderCell
headerView.headerImage.image = self.creatorImages[section]
headerView.headerImage.clipsToBounds = true
headerView.headerImage.layer.cornerRadius = headerView.headerImage.frame.size.width / 2
return headerView
}

从上面的程序可以看出,我创建的名为 self.creatorImages 的全局数组保存了我从 Facebook API 获取的图像数组,该数组始终为空,我需要“等待”让所有图片在实际使用之前填充数组。我不确定如何实现这一点,因为我确实在 getProfilePicture 函数中尝试了完成处理程序,但这似乎没有帮助,这是我学会处理异步函数的一种方法。还有其他想法吗?谢谢!

最佳答案

我也遇到了同样的问题,但我的问题是在 Objective-C 中好吧,结构并没有那么不同,我所做的是添加条件:headerView.headerImage.image

这是一个改进的解决方案,我认为适合您的实现。因为你把 self.getProfilePicture 放在 viewDidLoad 里面,它只会被调用一次 section==0 将只包含一个图像,

如果self.creatorImages的索引超出范围/界限,下面的代码将请求添加图像

func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
//Show section header cell with image
var cellIdentifier = "SectionHeaderCell"
var headerView = tableView.dequeueReusableCellWithIdentifier(cellIdentifier) as! SectionHeaderCell


if (section < self.creatorImages.count) // validate self.creatorImages index to prevent 'Array index out of range' error
{
if (headerView.headerImage.image == nil) // prevents the blinks
{
headerView.headerImage.image = self.creatorImages[section];
}
}
else // requests for additional image at section
{
// this will be called more than expected because of tableView.reloadData()
println("Loading Photo")

self.getProfilePicture { (result, image) -> Void in
if(result == true) {
//simply appending will do the work but i suggest something like:

if (self.creatorImages.count <= section)
{
self.creatorImages.append(image!)

tableView.reloadData()

println("self.creatorImages.count \(self.creatorImages.count)")
}
//that will prevent appending excessively to data source
}
else{
println("Error loading image")
}
}
}

headerView.headerImage.clipsToBounds = true
headerView.headerImage.layer.cornerRadius = headerView.headerImage.frame.size.width / 2
return headerView
}

你的实现确实与我的想法不同,但是编辑历史中的代码不是白费的,对吧?..哈哈哈哈..;)希望我对你有帮助......干杯!

关于ios - 异步加载图片不断导致图片闪烁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30357443/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com