平滑滚动UITableView iPhone,带图像

时间:2011-02-20 15:44:40

标签: iphone image url uitableview nsmutabledictionary

编辑: 在阅读下面的答案并查看我现在失去的所有指南之后,我太过于努力想出来了。

我不想为我完成编码,我需要一些明确的建议,如何设置一个单独的线程,然后将它引用到我的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];
                        });

4 个答案:

答案 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];
                }