NSThread,UITableViewCell和Image

时间:2011-06-14 17:46:08

标签: iphone uitableview nsthread

我目前在使用UITableView时遇到了一些问题,这是我第一次将缩略图放在我的表格视图单元格中,并且还将NSThread集成到加载缩略图图像中,所以,请光临我。感谢

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

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

然后在 - (void)requestFinished:(ASIHTTPRequest *)请求我将缩略图的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天不同的方法。非常感谢你。

2 个答案:

答案 0 :(得分:1)

一些事情。

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

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

1)您似乎没有检查细胞图像是否已经设置...如果您已经获得图像,则无需重新下载图像。你可能会因为dataWithContentsOfUrl提供一些缓存而侥幸成功,但我不确定。

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

答案 1 :(得分:0)

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

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

然后简单地说:

[thumbNailURL replaceObjectAtIndex:index withObject:thumbnail];