我刚刚开始使用线程,我正试图通过我的应用程序中的TableView获得更好的性能。每个tableViewCell都有一个imageView,并且在创建tableViewCell时从磁盘加载图像。我想在一个不同的线程上加载Image,然后在主线程上设置UIImageView。我的问题是,在另一个线程上运行的方法是否可以将值返回给主线程?这有更好的方法吗?
感谢您提前提供任何帮助。
答案 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];
}
您需要跟踪要为其加载图像的单元格,因此在加载图像时不要尝试加载它。可能会有一些小的语法错误,因为我没有编译它,只是徒手写。
icons
是NSMutableArray
为每个单元格保留UIImage
答案 1 :(得分:0)
答案 2 :(得分:0)
是的,您可以将数据传递给主线程。请参阅NSObject API docs中的以下方法:
- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait
您可以在arg
参数中传递单个对象引用。