如果下载了照片,我该如何存储照片?

时间:2011-12-31 18:45:43

标签: iphone objective-c cocoa-touch ipad

我有一个包含4张照片的UITableViewCell,我从网上获取这些照片,但问题是当我向下滚动UITableView时这些照片再次下载 enter image description here

这是代码:

       ITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cellPhoto"];

if (cell == nil) {

    NSArray *nibObject = [[NSBundle mainBundle] loadNibNamed:@"CustomCellThumbnails" owner:self options:nil];
    cell = [nibObject objectAtIndex:0];
}

// Get the photos
int getPhotos = indexPath.row * 4;

for (int i = 1; i <= 4; i++) {

    if (getPhotos < [imageArray count]) 
    {
        UIButton *imageButton = (UIButton*)[cell viewWithTag:i];
        NSString *url = [imageArray objectAtIndex:getPhotos];

        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://www.siteweb.com%@",url]]];
            UIImage *imageFieldProfile = [[UIImage alloc] initWithData:imageData];
            dispatch_async(dispatch_get_main_queue(), ^{
                // Set the phoyo to the UIButton
                [imageButton setBackgroundImage:imageFieldProfile forState:UIControlStateNormal];
                [imageFieldProfile release];
                // Set the corner of UIButton
                [imageButton.layer setCornerRadius:5.0];
                [imageButton.layer setMasksToBounds:YES];
                imageButton.tag = getPhotos;
            });
        }); 

        [imageButton addTarget:self action:@selector(displayPhoto:) forControlEvents:UIControlEventTouchUpInside];

    }         
    getPhotos ++;
}

3 个答案:

答案 0 :(得分:1)

您应该使用视图控制器来填充单元格,而不是UITableViewCell。如果你这样做,它不仅是一种更好的编码风格,而且保存数据也更容易。

无论如何,如果您真的必须:使用某种存储表初始化UITableViewCell,以便您可以存储下载的数据:将initWithStyle:reuseIdentifier:重写为initWithStyle:reuseIdentifier:usingCacheTable:

但是,再一次,正确的方法是在视图控制器中加载数据,让UIView子类只显示内容。

答案 1 :(得分:0)

您应该在下载图像时将图像保存或缓存在另一个对象中,而不是在表格视图单元格中。也许使用某种数据源或模型对象,表视图单元从中请求图像,而不是让表视图单元直接发出任何URL请求。然后,模型对象可以在下载之后以及将它们交给单元格之前缓存图像。

答案 2 :(得分:0)

您可以将延迟加载图像视图与本地缓存结合使用。使用ASIHTTPRequest和正确设置的缓存标志可以很容易地实现这一点。

ASIHTTPRequest非常易于使用,其缓存非常易于控制。

与建议的其他解决方案相比,我会坚持使用UITableView及其UITableViewCells,因为这将允许您使用de / queued单元格而无需自己构建此类逻辑。

我已将这种解决方案用于主要的新闻杂志应用程序(超过2个月的下载量),我对结果非常满意。