gpt4 book ai didi

ios - 使用 GCD 的异步 UITableViewCell 图像加载

转载 作者:技术小花猫 更新时间:2023-10-29 10:09:25 25 4
gpt4 key购买 nike

我目前正在尝试加载 Flickr 照片的 UITableView 列表(cs193p iOS Stanford,作业 5)。为避免 UI 阻塞事件,我已将每个单元格的缩略图下载推迟到不同的队列中(但请将 UI 更新回主队列)。此代码不会异步加载图像,但会在我单击 UITableViewCell 行后添加缩略图。 (见下面的截图)。知道我做错了什么吗?

PS:我已经查看了其他一些 stackoverflow 问题和 Apple 的 LazyTableImages 示例,但我仍然相信这是实现预期结果的最简洁方法。

谢谢!

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

// Configure the cell
NSDictionary *photo = [self.photoList objectAtIndex:indexPath.row];


if (photo != nil) {
if ([[photo objectForKey:@"title"] length] > 0) {
cell.textLabel.text = [photo objectForKey:@"title"];
} else if ([[[photo objectForKey:@"description"] objectForKey:@"_content"] length] > 0) {
cell.textLabel.text = [[photo objectForKey:@"description"] objectForKey:@"_content"];
} else {
cell.textLabel.text = @"Unknown";
}
}
cell.imageView.image = [[UIImage alloc] initWithCIImage:nil];

// Fetch using GCD
dispatch_queue_t downloadThumbnailQueue = dispatch_queue_create("Get Photo Thumbnail", NULL);
dispatch_async(downloadThumbnailQueue, ^{
UIImage *image = [self getTopPlacePhotoThumbnail:photo];
dispatch_async(dispatch_get_main_queue(), ^{
if ([self.tableView.visibleCells containsObject:cell]) {
[cell.imageView setImage:image];
}
});
});
dispatch_release(downloadThumbnailQueue);

return cell;
}

点击一行之前 Before clicking a row

选择行后 After selecting the row

更新:对于那些感兴趣的人,这是我使用的最终代码:

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

// Configure the cell
NSDictionary *photo = [self.photoList objectAtIndex:indexPath.row];

if (photo != nil) {
if ([[photo objectForKey:@"title"] length] > 0) {
cell.textLabel.text = [photo objectForKey:@"title"];
} else if ([[[photo objectForKey:@"description"] objectForKey:@"_content"] length] > 0) {
cell.textLabel.text = [[photo objectForKey:@"description"] objectForKey:@"_content"];
} else {
cell.textLabel.text = @"Unknown";
}
}
cell.imageView.image = [[UIImage alloc] initWithCIImage:nil];

// Fetch using GCD
dispatch_queue_t downloadThumbnailQueue = dispatch_queue_create("Get Photo Thumbnail", NULL);
dispatch_async(downloadThumbnailQueue, ^{
UIImage *image = [self getTopPlacePhotoThumbnail:photo];
dispatch_async(dispatch_get_main_queue(), ^{
UITableViewCell *cellToUpdate = [self.tableView cellForRowAtIndexPath:indexPath]; // create a copy of the cell to avoid keeping a strong pointer to "cell" since that one may have been reused by the time the block is ready to update it.
if (cellToUpdate != nil) {
[cellToUpdate.imageView setImage:image];
[cellToUpdate setNeedsLayout];
}
});
});
dispatch_release(downloadThumbnailQueue);

return cell;
}

最佳答案

您应该在设置缩略图后在单元格上调用setNeedsLayout

来自 Apple 文档:

“当你想调整一个 View 的 subview 的布局时,在你的应用程序的主线程上调用这个方法。这个方法会记录请求并立即返回。因为这个方法不会强制立即更新,而是等待下一个更新周期,您可以使用它在任何 View 更新之前使多个 View 的布局无效。此行为允许您将所有布局更新合并到一个更新周期,这通常有利于性能。”

关于ios - 使用 GCD 的异步 UITableViewCell 图像加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12311636/

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