编辑: 在阅读下面的答案并查看我现在失去的所有指南之后,我太过于努力想出来了。
我不想为我完成编码,我需要一些明确的建议,如何设置一个单独的线程,然后将它引用到我的tableView。
NOOB的任何教程?!?
这是我为将图像放入tableView而设置的代码。只有在滚动表格时才加载所有图像。
如何停止?
任何帮助都将不胜感激。
NSString *userImage = [(Tweet*)[profile objectAtIndex:indexPath.row] profileImage];
dispatch_async(dispatch_get_global_queue(0, 0), ^{
NSData* imageData = [[NSData alloc]initWithContentsOfURL:[NSURL URLWithString:[(Tweet*)[profile objectAtIndex:indexPath.row] profileImage]]];
dict =[[NSMutableDictionary alloc]init];
//UIImage *retImage =[dict objectForKey:(@"%@", userImage)];
UIImage *retImage =[dict objectForKey:userImage];
dispatch_async(dispatch_get_main_queue(), ^{
if (!retImage) {
UIImage *profileImage=[UIImage imageWithData:imageData];
[dict setObject:profileImage forKey:userImage];
}
UIImage *retImage2 =[dict objectForKey:userImage];
photo.image = retImage2;
[imageData release];
});
答案 0 :(得分:5)
在后台线程上加载图像是一种选择。更好的选择是使用自动处理后台线程的NSOperationQueue。
Apple已提供相同的样本。请查看Lazy Loading Of TableViewCells
我希望它有所帮助:)
编辑:如果您不知道,或者不想使用线程,那么还有另一种替代方案。看一下这个: downloading-images-for-table-without-threads
答案 1 :(得分:0)
你的影像有多大?您可能希望在将它们放入tableView之前缩小它们。
类似的东西:
#define kImageSize 44
// Create a thumbnail version of the image for the oject.
CGSize size = newImage.size;
CGFloat ratio ;
if (size.width > size.height) {
ratio = kImageSize / size.width;
} else {
ratio = kImageSize/ size.height;
}
CGRect rect = CGRectMake(0.0, 0.0, ratio * size.width, ratio * size.height);
if (NULL != UIGraphicsBeginImageContextWithOptions) { //test that function is available
UIGraphicsBeginImageContextWithOptions(rect.size, NO, 0); //allow iphone4 to use higher-res
} else {
UIGraphicsBeginImageContext(rect.size);
}
[newImage drawInRect:rect];
userThumbnailImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
另外,我注意到每次你的图像都在字典中时,你会再次存储;你可能想把缓存行放回(!photo.image)子句中。
答案 2 :(得分:0)
在后台线程中下载图像,当图像可用时,将它们设置到表格视图单元格中的UIImageView中。您通过网络加载图像来阻止主线程。
答案 3 :(得分:0)
[解决] 我添加了一个if语句,它不是最佳的,但如果图片不存在则只会滞后。
if (!image) {
[activityIndicator startAnimating];
UIImage *phoneImage=[UIImage imageWithData:[[NSData alloc]initWithContentsOfURL:[NSURL URLWithString:userImage]]];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString* path = [documentsDirectory stringByAppendingPathComponent:
[NSString stringWithFormat:@"%@:%@", imageName, fileName] ];
NSData* data = UIImagePNGRepresentation(phoneImage);
[data writeToFile:path atomically:YES];
}
else{
photo.image=image;
[activityIndicator stopAnimating];
}