如何改善图像加载问题。是否有像解决方案一样的缓存

时间:2013-06-20 05:41:50

标签: iphone ios objective-c parse-platform

我使用Parse.com构建了一个 iOS应用

在我的应用程序中,我已经从网络中显示了大量数据。

要快速加载数据,我使用了缓存kPFCachePolicyCacheThenNetwork 。它可以很好地加载数据,但滚动 图像需要花费一些时间来加载。

首先是白色图像,然后是图像加载。

Is there any solution like cache to display images in imageviews with out interruption.

感谢。

6 个答案:

答案 0 :(得分:3)

您可以使用SDWebImage执行此操作。

此外,您可以使用NSCache进行缓存。

答案 1 :(得分:2)

是的,您可以使用AFNetworking UIImageview类别并进行排序

如果您编辑现有图像,然后通过操纵其

从同一网址dwnload,您也可以禁用通常需要的特定图像的缓存
-(void)setImageWithURL:(NSURL *)url
       placeholderImage:(UIImage *)placeholderImage

如此blog

中所述

另一个选项可能是ASImageView,可以刷新缓存。

答案 2 :(得分:1)

我在gcd的帮助下编写代码,你必须传递imageView的对象并传递url,它管理所有的东西,比如缓存。

-(void)downloadingServerImageFromUrl:(UIImageView*)imgView AndUrl:(NSString*)strUrl{


strUrl = [strUrl encodeUrl];

NSString* theFileName = [NSString stringWithFormat:@"%@.png",[[strUrl lastPathComponent] stringByDeletingPathExtension]];


NSFileManager *fileManager =[NSFileManager defaultManager];

NSString *fileName = [NSHomeDirectory() stringByAppendingPathComponent:[NSString stringWithFormat:@"tmp/%@",theFileName]];



imgView.backgroundColor = [UIColor darkGrayColor];
UIActivityIndicatorView *actView = [[UIActivityIndicatorView alloc]initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite];
[imgView addSubview:actView];
[actView startAnimating];

CGSize boundsSize = imgView.bounds.size;
CGRect frameToCenter = actView.frame;
// center horizontally
if (frameToCenter.size.width < boundsSize.width)
frameToCenter.origin.x = (boundsSize.width - frameToCenter.size.width) / 2;
else
frameToCenter.origin.x = 0;




 // center vertically
if (frameToCenter.size.height < boundsSize.height)
frameToCenter.origin.y = (boundsSize.height - frameToCenter.size.height) / 2;
else
frameToCenter.origin.y = 0;

actView.frame = frameToCenter;



dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue, ^{

NSData *dataFromFile = nil;
NSData *dataFromUrl = nil;

dataFromFile = [fileManager contentsAtPath:fileName];
if(dataFromFile==nil){
    dataFromUrl=[[[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:strUrl]] autorelease];                      
}

dispatch_sync(dispatch_get_main_queue(), ^{

    if(dataFromFile!=nil){
        imgView.image = [UIImage imageWithData:dataFromFile];
    }else if(dataFromUrl!=nil){
        imgView.image = [UIImage imageWithData:dataFromUrl];  
        NSString *fileName = [NSHomeDirectory() stringByAppendingPathComponent:[NSString stringWithFormat:@"tmp/%@",theFileName]];

        BOOL filecreationSuccess = [fileManager createFileAtPath:fileName contents:dataFromUrl attributes:nil];       
        if(filecreationSuccess == NO){
            NSLog(@"Failed to create the html file");
        }

    }else{
        imgView.image = [UIImage imageNamed:@"NO_Image.png"];  
    }
    [actView removeFromSuperview];
    [actView release];
    [imgView setBackgroundColor:[UIColor clearColor]];
});
});

}

答案 3 :(得分:0)

以下是在后台加载图片的代码。检查此Code

答案 4 :(得分:0)

你应该使用EGOImageLoading(EGOImageLoading)来延迟加载图像,并且可以使用NSUserDefaults保存图像。

这是我建议的最佳方式,因为我在许多项目中使用过它。

答案 5 :(得分:0)

很抱歉这么说,但是Parse已经做了所有这些事情。 Parse使用AFNetworking来获取图像,将它们放入NSCache中,并且非常积极地使用磁盘缓存,以便完全避免冗余网络跳转(版本是URL的一部分,因此Parse甚至不需要使用if-modified - 因为GET)。

您可能遇到的最大问题是PFFile限制下载,一次只能下载3张图像。在实验之后,这是最好的数字,因为它确保了对用户的增量反馈并避免了一些令人讨厌的问题,其中一些iOS设备在太多线程之后会得到非常差的性能。我能提供的最好的建议是尽可能预取一些图像。如前所述,PFFile图像被非常积极地缓存。 kPFCachePolicy ...东西只影响可能变得陈旧的查询;这些查询指向的图像总是被缓存(尽管最初只是按需下载)。