gpt4 book ai didi

ios - 单元格背景图片已下载,但下载完成后需要 5 秒才能显示

转载 作者:行者123 更新时间:2023-11-28 22:05:05 25 4
gpt4 key购买 nike

我希望 UITableView 在被点击后立即出现。在 UITableView 的每个单元格中都有一张取自 Flickr 的背景图片,因此必须在后台线程中下载图片。

所以一切都很完美,图像在一个单独的线程中成功下载。但问题是,您必须在他们完成下载后等待 5 秒,图像才能真正出现在每个单元格中:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"rightMenuCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

UILabel *lblTitle = (UILabel *)[cell viewWithTag:1];
UIImageView *imgCube = (UIImageView *)[cell viewWithTag:2];
UIActivityIndicatorView *spinnerFlickr = (UIActivityIndicatorView *)[cell viewWithTag:4];

// Configure the cell...
NSDictionary *region = self.regions[indexPath.row];

//default hashtag is life
NSString *hashTag;

cell.detailTextLabel.text = [region valueForKeyPath:@"name"];
cell.detailTextLabel.hidden = TRUE;
lblTitle.text = [region valueForKeyPath:@"name"];

NSString *regionType = [region valueForKeyPath:@"region"];
if ([regionType isEqual: @"neighborhood"]) {
hashTag = @"houses";
cell.textLabel.text = @"neighborhood";
} else if ([regionType isEqual: @"locality"]) {
hashTag = @"urban";
cell.textLabel.text = @"locality";
} else {
hashTag = @"life";
cell.textLabel.text = @"administrative_area_level_2";
}

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0),
^{
UIImageView *imgBackground = (UIImageView *)[cell viewWithTag:3];
[imgBackground setClipsToBounds:YES];

NSLog(@"loading image data...");
NSString *flickrURL = [NSString stringWithFormat:@"http://domfa.de/get_image/?text=%@&lat=%f&long=%f", hashTag, self.latitude, self.longitude];
NSData *image = [[NSData alloc] initWithContentsOfURL: [NSURL URLWithString: flickrURL]];

UIImage *cellBG = [[UIImage alloc] init];
cellBG = [UIImage imageWithData:image];
imgBackground.image = cellBG;
[imgBackground reloadInputViews];

NSLog(@"images loaded!");

imgBackground.image = cellBG;
[spinnerFlickr stopAnimating];
});

return cell;
}

基本上每个单元格都会异步下载背景图像,但即使下载完成后,我也必须点击一个单元格或等待 5 秒,然后 2/3 的单元格才会加载图像。

最佳答案

dispatch_get_global_queue() 获取后台队列,而不是主队列。你只能在主队列中做 UI 相关的事情。您的图像提取应如下所示:

dispatch_async(dispatch_get_global_queue(…) , 
^{

// Do non-UI-related things like fetch your UIImage from the network
UIImage *image = [self fetchAndCacheImageAtURL:imageURL] ;

dispatch_async(dispatch_get_main_queue() ,
^{
// Assign your UIImage to your UIImageView
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath] ;
if( cell )
cell.imageView.image = image ;
}) ;
}) ;

请注意,在第二个 dispatch_async() 中,我使用 -cellForRowAtIndexPath: 再次获取单元格。这是因为在这段代码运行时,原始单元格可能已被重新用于不同 索引路径(因为,比方说,用户一直在滚动)。事实上,当前索引路径可能没有单元格,因为该索引路径可能已滚出屏幕。这一点,加上检查单元格是否为零,确保您在该索引路径的正确单元格上设置图像。

关于ios - 单元格背景图片已下载,但下载完成后需要 5 秒才能显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24224868/

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