最近我创建了一个帖子:NSData caching routine
但是,现在我想在我所要求的内容中更具体。
你看,我有" carousel",实际上是一个有7张图像的滚动视图。首次出现时,它会从互联网加载图像并自动滚动。
我的问题是,我不希望每次滚动时都会加载图片。幸运的是,有一些"缓存"机械师在后台工作。因此,当它加载所有图像,然后终止应用程序,然后在没有互联网连接的情况下启动,所有图像都已设置,因此,它以某种方式从某处加载它。
我使用的代码是:
NSError *error;
NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@%@", WEBSITE, mdl.imageSubUrl]] options:NSDataReadingUncached error:&error];;
NSLog(@"data size0? %lu", (unsigned long)data.length);
就是这样。您可能想要自己尝试,加载一些图像,然后在飞行模式下重新启动应用程序并检查字节长度。即使在我搜索数据时也会有数据,并且据说dataWithContentsOfURL
没有任何缓存。
所以,我想要的只是检查,如果有数据,如果是,不下载它。像这样:
if (haveData){
self.ivPic.image = [UIImage imageWith:myData];
} else {
NSError *error;
NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@%@", WEBSITE, mdl.imageSubUrl]] options:NSDataReadingUncached error:&error];;
NSLog(@"data size0? %lu", (unsigned long)data.length);
}
不幸的是,我不知道如何进行此类测试(如果有数据)。其次,我不太确定如何加载存储的数据,而不是dataWithContentsOfURL,它将从主机启动加载。
答案 0 :(得分:2)
到达此链接:我在这里给出了答案:Check type of class an NSData store?
希望这会对你有所帮助。
答案 1 :(得分:1)
如果您自己这样做,可以使用NSCache
和本地文件系统创建双层缓存系统。所以,
在应用启动时,实例化NSCache
对象。
当您需要下载图片时,请查看图片是否在NSCache
。
如果没有,请查看图片是否在文件系统的NSCachesDirectory
文件夹中,如果在此处找到,但在NSCache
中找不到,请确保相应地更新NSCache
。
如果同时在NSCache
和NSCachesDirectory
中找不到,请从网络异步请求(使用NSURLSession
),如果您成功找到了图片,请同时更新NSCache
并相应地NSCachesDirectory
。
BTW,在UIApplicationDidReceiveMemoryWarningNotification
后,请务必清空NSCache
。
这看起来像是:
NSString *filename = [webURL lastPathComponent];
NSURL *fileURL;
// look in `NSCache`
NSData *data = [self.cache objectForKey:filename];
// if not found, look in `NSCachesDirectory`
if (!data) {
NSError *error;
NSURL *cacheFileURL = [[NSFileManager defaultManager] URLForDirectory:NSCachesDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:false error:&error];
fileURL = [cacheFileURL URLByAppendingPathComponent:filename];
data = [NSData dataWithContentsOfURL:fileURL];
// if found, update `NSCache`
if (data) {
[self.cache setObject:data forKey:filename];
}
}
// if still not found, retrieve it from the network
if (!data) {
[[NSURLSession sharedSession] dataTaskWithURL:webURL completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if (error) {
// handle error
return;
}
UIImage *image = [UIImage imageWithData:data];
// if image retrieved successfully, now save it
if (image) {
dispatch_async(dispatch_get_main_queue(), ^{
[self.cache setObject:data forKey:filename];
NSError *fileError;
[data writeToURL:fileURL options:NSDataWritingAtomic error:&fileError];
});
}
}];
}
说完所有这些后,我同意其他人的意见,值得尝试SDWebImage和/或AFNetworking中找到的UIImageView
类别。他们可能会做你需要的工作,而工作则少得多。