我使用Parse.com构建了一个 iOS应用。
在我的应用程序中,我已经从网络中显示了大量数据。
要快速加载数据,我使用了缓存kPFCachePolicyCacheThenNetwork
。它可以很好地加载数据,但滚动 图像需要花费一些时间来加载。
首先是白色图像,然后是图像加载。
的 Is there any solution like cache to display images in imageviews with out interruption.
的
感谢。
答案 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 ...东西只影响可能变得陈旧的查询;这些查询指向的图像总是被缓存(尽管最初只是按需下载)。