我想存储一个数组,以便在启动时可用。数组中的每个项表示列表中的项,在保存到数组中之前将其转换为JSON格式。
我一直把它保存到NSUserDefaults,但是每次我想要更改其中的单个项目时,我都不想将整个数组保存到NSUserDefaults。理想情况下,我只是在数组内部更改该值,而不需要更改其他值。而且我还需要在数组中添加和删除项目,而且,我不想保存整个数组只是为了做到这一点。
有更有效的方法吗?
现在,我一直在用自己的标识符保存到NSUserDefaults的每个项目以及每个标识符的正确顺序的数组中解决这个问题。然而,这已成为一个复杂的解决方案,存在问题。
答案 0 :(得分:2)
为什么不使用NSArray
而不是使用NSDictionary
来保存您的数据,而不是使用JSON
,这样您就可以更轻松地获取数据并更轻松地转换为{{1 }}。
所以我做了类似的事情:
// Few constants for keys
NSString const *itemsListKey = @"FruitItems";
NSString const *applesKey = @"Apples";
NSString const *bananasKey = @"Bananas";
创建新词典并将其添加到NSUserDefaults
NSMutableDictionary *items = [[NSMutableDictionary alloc] init];
[items setObject:5 forKey:applesKey];
[items setObject:2 forKey:bananasKey];
[[NSUserDefaults standardUserDefaults] setObject:items forKey:itemsListKey];
[[NSUserDefaults standardUserDefaults] synchronize];
检索现有词典并修改NSUserDefaults
// The dictionary retrieved isn't mutable so we need to get a mutable copy of it.
NSMutableDictionary *itemsRetrieved = [[[NSUserDefaults standardDefaults] dictionaryForKey:itemsListKey] mutableCopy];
// Lets update our Apples value
[itemsRetrieved setObject:9 forKey:applesKey];
// Set the dictionary back into NSUserDefaults
[[NSUserDefaults standardUserDefaults] setObject:items forKey:itemsListKey];
[[NSUserDefaults standardUserDefaults] synchronize];
您会注意到两种不同方法之间没有太大差异,因此您可以将其整合到一个方法中,如下所示。
// Obviously this constant being the key to your dictionary
NSString const *itemsListKey = @"itemsList";
- (void)updateItemsForKey:(NSString *)key withValue:(NSInteger)value
{
NSMutableDictionary *items [[NSMutableDictionary alloc] init];
if ([[NSUserDefaults standardDefaults] dictionaryForKey:itemsListKey] != nil) {
// If the key already exist in NSUserDefaults reallocate it
// to the one that exists.
items = [[[NSUserDefaults standardDefaults] dictionaryForKey:itemsListKey] mutableCopy];
}
[itemsRetrieved setObject:value forKey:key];
// Assign the dictionary back into NSUserDefaults
[[NSUserDefaults standardUserDefaults] setObject:items forKey:itemsListKey];
[[NSUserDefaults standardUserDefaults] synchronize];
}
修改 - 根据他们希望订购的评论。
如果NSDictionary
处于排序顺序,我们真的不在乎。如果我们想要按排序顺序排列对象,我们可以在进行allKeys
调用时将字典的键排序为排序顺序。
NSArray *orderedKeys = [[items allKeys] sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
return [(NSString *)obj1 compare:(NSString *)obj2 options:NSNumericSearch];
}];
上面的代码将为您提供数字排序的数组,然后循环遍历orderedKeys
数组,以按您想要的顺序获取所需的值:
for (NSString *key in orderedKeys) {
id objectFromDict = [items objectForKey:key];
// Do whatever you want with that object.
}
答案 1 :(得分:0)
保存整个阵列有什么问题?如果要编辑一个项目,请从NSUserDefaults
中获取数组(创建可变副本),更改相应项目,然后保存数组。