gpt4 book ai didi

objective-c - 如何验证从队列返回的内容与其预期的 UITableView 单元格匹配?

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

我是 iOS 开发新手,这是我在 stackoverflow 上的第一个问题,尽管我经常来这里。感谢您提供如此好的资源!

我正在参加斯坦福大学 CS193P 类(class),但在“作业 5 额外学分 1”方面遇到了麻烦。
我有一个显示标题、副标题和缩略图的 UITableView。我对缩略图获取进行排队,但需要验证当缩略图返回时表格单元格尚未被回收。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Photo";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}

NSDictionary *imageDescription = [self.photoList objectAtIndex:indexPath.row];
NSString *expectedPhotoID = [imageDescription objectForKey:FLICKR_PHOTO_ID];

// Configure the cell...

cell.imageView.image = [UIImage imageNamed:@"placeholder.png"];

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
UIImage *imageThumb = [self imageForCell:imageDescription];
[NSThread sleepUntilDate:[NSDate dateWithTimeIntervalSinceNow:2]]; // simulate 2 sec latency

dispatch_async(dispatch_get_main_queue(), ^{
NSString *photoID = [imageDescription objectForKey:FLICKR_PHOTO_ID];
if ([expectedPhotoID isEqualToString:photoID]) {
cell.imageView.image = imageThumb;
} else {
NSLog(@"cellForRowAtIndexPath: Got image for recycled cell");
}
});
});

return cell;
}

在此代码中,photoID 始终与 expectedPhotoID 匹配。我假设这是因为 imageDescription 指针在创建两个队列时都用于它们。我尝试直接使用 [self.photoList objectAtIndex:indexPath.row] (代替 imageDescription),但这也不起作用。看起来这个问题在创建队列时也已解决。

我在这里缺少一些基本的理解,感谢您的帮助。

最佳答案

TableView 不会为所有行分配 TableView 单元格。相反,仅分配可见行(或多一点)的单元格。如果滚动表格,某些行会消失,而其他行会出现。对于新出现的行, TableView 会尝试重用不再需要的单元格。 (这就是 dequeueReusableCellWithIdentifier: 的作用。)

如果您启动异步任务来检索单元格的图像,则可能会发生以下情况:

当任务完成并且执行最里面的 block 时,单元格同时已被重新用于不同的行!在这种情况下,将图像分配给单元格是没有意义的。

因此,当您获得图像时,必须检查单元格是否仍处于与之前相同的位置。例如,您可以调用 [tableView indexPathForCell:cell] 并将该值与原始 indexPath 进行比较。如果它们相同,则单元格仍位于相同位置,您可以分配图像。如果没有,您必须丢弃该图像。

但这只是最简单的解决方案。更好的解决方案是缓存所有行的图像。

我只能推荐 WWDC 2012 Session 2011“在 iOS 上构建并发用户界面”。它涵盖了这个主题。

关于objective-c - 如何验证从队列返回的内容与其预期的 UITableView 单元格匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11957194/

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