Objective C线程,在iOS tableViewCell中设置图像

时间:2011-03-24 12:46:14

标签: iphone objective-c ios tabs

我刚刚开始使用线程,我正试图通过我的应用程序中的TableView获得更好的性能。每个tableViewCell都有一个imageView,并且在创建tableViewCell时从磁盘加载图像。我想在一个不同的线程上加载Image,然后在主线程上设置UIImageView。我的问题是,在另一个线程上运行的方法是否可以将值返回给主线程?这有更好的方法吗?

感谢您提前提供任何帮助。

3 个答案:

答案 0 :(得分:2)

也许是这样的,假设你的图标在文档的目录中:

#define DOCUMENTS_DIRECTORY [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]

//inside - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
NSDictionary *d = [NSDictionary dictionaryWithObjectsAndKeys:indexPath, @"indexPath", @"image1.png", @"imageName", nil];
[NSThread detachNewThreadSelector:@selector(loadIcon:) toTarget:self withObject:d];
//

- (void)iconLoaded:(NSDictionary*)dict {
    [icons replaceObjectAtIndex:[[dict objectForKey:@"index"] intValue] withObject:[UIImage imageWithData:[dict objectForKey:@"imageData"]]];
    [tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:[dict objectForKey:@"indexPath"]]];
}
- (void)loadIcon:(NSDictionary*)dict {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    NSString *filePath = [DOCUMENTS_DIRECTORY stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.jpg", [dict objectForKey:@"imageName"]]];
    NSData *imageData = [NSData dataWithContentsOfFile:filePath];
    [self performSelectorOnMainThread:@selector(iconLoaded:) withObject:[NSDictionary dictionaryWithObjectsAndKeys:[dict objectForKey:@"indexPath"], "indexPath", imageData, @"imageData", nil] waitUntilDone:YES];


    [pool drain];
}

您需要跟踪要为其加载图像的单元格,因此在加载图像时不要尝试加载它。可能会有一些小的语法错误,因为我没有编译它,只是徒手写。

iconsNSMutableArray为每个单元格保留UIImage

答案 1 :(得分:0)

答案 2 :(得分:0)

是的,您可以将数据传递给主线程。请参阅NSObject API docs中的以下方法:

- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait

您可以在arg参数中传递单个对象引用。