NSData存储在某个地方

时间:2016-05-15 09:26:05

标签: ios objective-c

最近我创建了一个帖子: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,它将从主机启动加载。

2 个答案:

答案 0 :(得分:2)

答案 1 :(得分:1)

如果您自己这样做,可以使用NSCache和本地文件系统创建双层缓存系统。所以,

  1. 在应用启动时,实例化NSCache对象。

  2. 当您需要下载图片时,请查看图片是否在NSCache

  3. 如果没有,请查看图片是否在文件系统的NSCachesDirectory文件夹中,如果在此处找到,但在NSCache中找不到,请确保相应地更新NSCache

  4. 如果同时在NSCacheNSCachesDirectory中找不到,请从网络异步请求(使用NSURLSession),如果您成功找到了图片,请同时更新NSCache并相应地NSCachesDirectory

  5. BTW,在UIApplicationDidReceiveMemoryWarningNotification后,请务必清空NSCache

  6. 这看起来像是:

    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类别。他们可能会做你需要的工作,而工作则少得多。