我可以根据另一个 NSUserDefault 值保存 NSUserDefault 值吗?

Posted

技术标签:

【中文标题】我可以根据另一个 NSUserDefault 值保存 NSUserDefault 值吗?【英文标题】:Can I save an NSUserDefault value based on another NSUserDefault value? 【发布时间】:2016-12-20 17:45:15 【问题描述】:

这是我想要实现的目标: 我已将位置保存在 NSUserDefaults 中。现在,在 NSUserDefault 中添加了这个,用户将选择一个值,我想将此值保存在这个位置。因此,当用户再次选择该位置时,我可以取回所选位置。因此,不同位置的此值不同,用户也可以随时更改它们。我想知道是否可以这样做?如果不是,那么优化的方法是什么?我还没有开始这个实现,所以没有代码。

【问题讨论】:

您在键值的基础上保存值。如果密钥相同,则每次保存该值时,该值都会覆盖。如果密钥不同,那么您需要一种方法来跟踪所有这些密钥! 【参考方案1】:

如果要保存字典:

let dict:[String:String] = ["key":"value"]
// set multiple values into a specific location
UserDefaults.standard.set(dict, forKey: "locationA")

// get the values for a given location
let result = UserDefaults.standard.value(forKey: "locationA")
print(result!)

或者一个简单的值

let value = "value"

// set simple value into a specific location (for key)
UserDefaults.standard.set(value, forKey: "locationA")

// get the value for a given location
let result = UserDefaults.standard.value(forKey: "locationA")
print(result!)

【讨论】:

【参考方案2】:

这是可以做到的。对于每个位置,您可以创建一个包含两项的NSArray,其中第一项是位置,第二项是值。例如:

NSArray *locationData = @[location, value];

您将保留这两项NSArrays 中的NSArray,并将其保存到NSUserDefaults

NSArray *allLocations = @[@[location1, value1], @[location2, value2], ...];
[[NSUserDefaults standardUserDefaults] setObject:allLocations forKey:@"LocationData"];

要查找特定位置的值,您需要遍历数组(此代码将 100m 内的任何位置视为同一位置):

- (id)valueForLocation:(CLLocation *)location 
    for (NSArray *locInfo in allLocations) 
        CLLocation *loc = (CLLocation *) locInfo[0];
        if ([location distanceFromLocation:loc] < 100) 
            return locInfo[1];
        
    
    return nil;

另一种方法是将此信息存储在字典中,并锁定位置。您不能直接将CLLocation 用作键,但您将CLLocation 的坐标放入NSValue 并使用它。更多详情请见using CLLocation objects as keys in dictionary。

【讨论】:

以上是关于我可以根据另一个 NSUserDefault 值保存 NSUserDefault 值吗?的主要内容,如果未能解决你的问题,请参考以下文章

NSUserDefault 更新公式

iOS 4.2 中的 NSUserDefault 问题

Keychain 和 NSUserDefault 的区别?

Xcode 中的 NSUserDefault

读取 NSUserDefault 布尔值

我如何访问 iOS 项目的 NSUserDefault 以做出原生反应?