【问题标题】:NSThread, UITableViewCell and ImageNSThread、UITableViewCell 和图像
【发布时间】:2019-09-08 04:30:54
【问题描述】:

我的 UITableView 有问题。我正在下载数据并像往常一样设置单元格,但这次添加了 NSThread。

首先我会在我的视图中调用 ASIHTTPRequest 并加载

然后在 - (void)requestFinished:(ASIHTTPRequest *)request 我将缩略图的 url 添加到 NSMutableArray 中

 NSString *photoURLString = [NSString stringWithFormat:@"http://some.url.com/img/%@",[thearray objectForKey:@"tn_url"]];    
[thumbNailURL addObject:(photoURLString)];

在 cellForRowAtIndexPath: 我设置其他数据显示的地方,我会调用我的 NSThread

[NSThread detachNewThreadSelector:@selector(loadImage:) toTarget:self withObject:indexPath];

在我的 loadImage 线程中

- (void) loadImage: (NSIndexPath*) indexPath{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSString *iconURL = [thumbNailURL objectAtIndex:indexPath.row];
NSURL *url = [NSURL URLWithString:iconURL]; 
UIImage *icon = [UIImage imageWithData:[NSData dataWithContentsOfURL:url]];
cellImageView = [[UIImageView alloc] initWithFrame:CGRectMake(11.0, 6.0, 61.0, 50.0)];
[cellImageView setImage:icon];
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
[cell.contentView performSelectorOnMainThread:@selector(addSubview:) withObject:cellImageView waitUntilDone:NO];
[pool drain];

}

所有数据和图片都加载得很好,但是如果我上下滚动得更快,应用程序将挂起并出现以下错误

[1997:7a1f] *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayM objectAtIndex:]: index 6 beyond bounds [0 .. 5]'    (0x31312d2f 0x345f50e3 0x3127d1b1 0x35aefc1d 0xf4dd 0x333ffb51 0x3347c67b 0x366af589 0x366b2310) terminate called throwing an exceptionProgram received signal:  “SIGABRT”.

如果我错了,如果有人能告诉我正确的配置,那就太好了,因为过去 3 天我一直在尝试不同的方法。

【问题讨论】:

    标签: iphone uitableview nsthread


    【解决方案1】:

    几件事。

    首先,我建议您考虑使用 SDWebImage 之类的东西进行异步图像下载(看起来 Olivier Poitrey 是原作者)。 Github 存储库在这里:https://github.com/rs/SDWebImage。我将它用于这个目的,它很棒。

    也就是说,我在这里看到了一些东西。

    1)您似乎没有检查单元格图像是否已设置...如果您已经获得图像,则无需重新下载。因为dataWithContentsOfUrl 可能会提供一些缓存,所以您可能会侥幸逃脱,但我不确定。

    2) 我无法从这里的代码中看出,但您需要确保在调用 之后 requestFinished 之前不允许表格视图加载其数据。否则,您将遇到可能导致您看到的错误类型的竞争条件。考虑在requestFinished方法中设置tableView的数据源,然后调用reloadData。否则,按照 downed 的建议执行操作,只需使用 [NSNull null] 对象预填充 URL 数组。

    【讨论】:

    • 首先,非常感谢您的大力帮助,SDWebImage 非常棒!而且很容易集成。为了弥补我在问题中遗漏的内容,是的,我没有检查图像是否存在,我猜它每次重新使用单元格并导致崩溃时都会下载(尽管我不确定我应该在哪里集成检查);如果异步尚未完成,我实际上有一个占位符单元设置,一旦完成,它将重新加载数据。所以到 NSThread 为止一切都很好。
    【解决方案2】:

    您是否尝试过让数组“thumbNailURL”包含 [NSNull null] 对象来表示您尝试显示的项目数,然后在异步加载它们后替换它们,这样您就不会比数组更快.

    thumbNailURL = [[NSMutableArray alloc] init];
    for (unsigned i = 0; i < [items count]; i++) {
        [thumbNailURL addObject:[NSNull null]];
    }
    

    那么简单:

    [thumbNailURL replaceObjectAtIndex:index withObject:thumbnail];
    

    【讨论】:

    • 谢谢,但我相信是 NSThread 导致了问题,而不是数组,如果异步请求尚未完成或没有返回结果,我配置了一个空白加载单元。没有 NSThread 加载图像部分,一切都很好。所以,肯定有什么我想不通的问题>,
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多