我正在我正在使用的应用程序中构建一个图像缓存,其中缓存是一个NSMutableDictionary。
最初字典看起来像这样:
NSMutableDictionary *imageCacheDictionary = [NSMutableDictionary initWithContentsOfURL:imageCacheURL];
//alloc-init imageCacheDictionary if nil
NSData *imageData = UIImageJPEGRepresentation(image, 1.0);
NSString *imageURLAsString = [imageURL absoluteString];
[imageCacheDictionary setObject:imageData forKey:imageURLAsString];
if ([imageCacheDictionary writeToURL:cacheURL atomically:YES]) {
NSLog(@"file written");
} else {
NSLog(@"file NOT written");
}
游泳工作。
然后,当我决定添加代码以将缓存维持在一定的大小时,我尝试添加一个标记,以便我可以先删除最旧的照片。
NSMutableDictionary *imageCacheDictionary = [NSMutableDictionary initWithContentsOfURL:imageCacheURL];
//alloc-init imageCacheDictionary if nil
NSData *imageData = UIImageJPEGRepresentation(image, 1.0);
NSString *imageURLAsString = [imageURL absoluteString];
NSDate *currentTime = [NSDate date];
NSDictionary *imageDataWithTime = @{currentTime : imageDataWithTime};
[imageCacheDictionary setObject:imageDataWithTime forKey:imageURLAsString];
if ([imageCacheDictionary writeToURL:cacheURL atomically:YES]) {
NSLog(@"file written");
} else {
NSLog(@"file NOT written");
}
哪个不起作用。
据我所知,NSDate是属性列表兼容的,所以writeToURL应该让你写入磁盘,但是没有。
然后我尝试使用NSKeyedArchiver将其转换为NSData。
...
NSData *currentTimeAsData = [NSKeyedArchiver archivedDataWithRootObject:[NSDate date]];
NSDictionary *imageDataWithTime = @{currentTimeAsData : imageData};
...
仍然无法正常工作。
但是如果我将NSDate对象转换为NSString或者只是用NSString替换它,它就可以正常工作。
...
NSString *currentTime = [[NSDate date] description];
NSDictionary *imageDataWithTime = @{currentTime : imageData};
...
或者:
...
NSString *currentTime = @"Hey! Now is now!";
NSDictionary *imageDateWithTime = @{currentTime : imageData};
...
那么......为什么?如果NSDate和NSData都符合属性列表,为什么它们都没有写入嵌套字典中的磁盘,而NSString写得很好?
答案 0 :(得分:1)
属性列表键必须是字符串,它们不能是日期。 This page here说:
虽然NSDictionary和CFDictionary对象允许它们的键是任何类型的对象,但如果键不是字符串对象,则集合不是属性列表对象。
您需要的是字典中的字典,例如:
NSDictionary *imageInfo = @{ @"date" : [NSDate date], @"data" : imageData };
NSDictionary *mainCacheDict = @{ imageURLAsString : imageInfo };
这样,缓存字典仍然将字符串URL作为键,但值是第二个字典,其中包含日期和图像数据(使用字符串键@"date"
和@"data"
访问)。这符合属性列表,因此您可以继续使用writeToFile:
和initWithContentsOfFile:
方法。
答案 1 :(得分:0)
问题在于你在字典中制作的数据。请尝试以下方法: -
NSData *imageData = UIImageJPEGRepresentation(image, 1.0);
NSString *imageURLAsString = [imageURL absoluteString];
NSDate *currentTime = [NSDate date];
//Below your code has modified
[imageCacheDictionary setObject:currentTime forKey:imageDataWithTime];
NSDictionary *imageDataWithTime =[NSDictionary dictionaryWithObject:imageCacheDictionary forKey:imageURLAsString];
if ([imageDataWithTime writeToFile:@"yourPath" atomically:YES]) {
NSLog(@"file written");
} else {
NSLog(@"file NOT written");
}
答案 2 :(得分:0)
试试这个:我修改了你的代码:
NSData *imageData = UIImageJPEGRepresentation(image, 1.0);
NSDate *currentTime = [NSDate date];
NSDictionary *imageDataWithTime = @{currentTime : imageDataWithTime};
NSMutableData *data = [[NSMutableData alloc] init];
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
[archiver encodeObject:imageDataWithTime forKey:@"Some Key Value"];
[archiver finishEncoding];
if ([data writeToURL:cacheURL atomically:YES]) {
NSLog(@"file written");
} else {
NSLog(@"file NOT written");
}