gpt4 book ai didi

objective-c - reloadRowsAtIndexPaths 停止加载 UITableViewCells?

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

我正在尝试将网站图标合并到 UITableView 中。该表基本上是获取网站,我想在右侧显示图标。我最初在右边放了一个占位符图标,让后台运行一个函数。此函数获取网站的 URL,对其进行解析并尝试查找网站图标。如果找不到,它会保留相同的占位符图像;否则,它会用站点的图标替换它。我最初尝试使用在模拟器中运行良好的 [tableView reloadData],但它确实做了一些奇怪且不可靠的事情(例如,它会创建一些单元格,但随后会留下一个巨大的空白单元格)。无论如何,我偶然发现了 reloadRowsAtIndexPaths,它似乎是我需要使用的功能。然而,结果仍然很不可靠。我的抓取功能在后台运行:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
...//other code here for showing website labels

//obtain the favicon.ico
if(!this_article.iconLoaded){
this_article.iconLoaded = TRUE;
NSDictionary *args = [NSDictionary dictionaryWithObjectsAndKeys:this_article, @"article", indexPath, @"indexPath", nil];
[self performSelectorInBackground:@selector(fetchFaviconWrapper:) withObject:args];
}

cell.favicon.image = this_article.icon;

return cell;
}

在 FetchFaviconWrapper 中:

- (void)fetchFaviconWrapper:(NSDictionary *)args {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
[self fetchFavicon:[args objectForKey:@"article"]];
NSArray *paths = [NSArray arrayWithObject:[args objectForKey:@"indexPath"]];
[articleTable beginUpdates];
[articleTable reloadRowsAtIndexPaths:paths withRowAnimation:UITableViewRowAnimationFade];
[articleTable endUpdates];
[pool release];
}

基本上,fetchFavicon 获取一个网站,获取主机 URL,附加“/favicon.ico”,将其构造为 NSData 对象,然后查找图像(如果存在)。但是,这也很不可靠。在后台运行线程时替换占位符图像的最佳方法是什么?我可以在主线程上做所有事情,但这只会让表加载缓慢。似乎有些东西我忽略了,或者有些东西我只是忘了添加...只是想不通。

最佳答案

您是否从单独的线程访问和修改您的 UI 并不完全清楚。

如果是这样,这就是你不可靠的原因。 UIKit 只能从主线程访问。如果您有兴趣,您会在 S.O. 上找到很多问题。以及网络上的许多讨论。

如果您想保留第二个线程,有一个解决方法。实际上,您可以使用以下方法向您的 UI 对象发送消息:

-performSelectorOnMainThread:withObject:waitUntilDone:

而不是直接从辅助线程发送它们。

如果此解决方法不能为您解决问题,那么我建议重新设计您的应用,以便辅助线程仅访问您的模型,而不访问 UI。所有修改UI的操作都应该在主线程上执行。如果您需要在模型准备就绪时在您的表上调用 reloadData,您可以使用 performSelectorOnMainThread:withObject:waitUntilDone 来完成。

关于objective-c - reloadRowsAtIndexPaths 停止加载 UITableViewCells?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6193644/

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