gpt4 book ai didi

ios - 使用 writeToURL 将 NSDate 保存到文件

转载 作者:行者123 更新时间:2023-11-29 13:02:03 24 4
gpt4 key购买 nike

我正在我正在开发的应用程序中构建图像缓存,其中缓存是一个 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 写入正常?

最佳答案

属性列表键必须是字符串,不能是日期。 This page here说:

And although NSDictionary and CFDictionary objects allow their keys to be objects of any type, if the keys are not string objects, the collections are not property-list objects.

你需要的是字典中的字典,例如:

NSDictionary *imageInfo = @{ @"date" : [NSDate date], @"data" : imageData };

NSDictionary *mainCacheDict = @{ imageURLAsString : imageInfo };

这样,缓存字典仍然以字符串 URL 作为键,但值是包含日期和图像数据的第二个字典(使用字符串键 @"date" 访问)和@“数据”)。这是符合属性列表的,因此您可以继续使用 writeToFile:initWithContentsOfFile: 方法。

关于ios - 使用 writeToURL 将 NSDate 保存到文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19533467/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com