在 Swift 中存储应用程序设置
Storing App Settings in Swift
我需要在我的应用程序首次加载时使用一些 'core' 表为我的数据库做种。在我的 AppDelegate 中使用 NSUserDefaults 的最佳方法是:
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
NSUserDefaults.standardUserDefaults().registerDefaults([
"hasSeededCoreTables": false
])
return true
}
或者我应该在核心数据中创建一个 'Settings' 实体并在其中设置一个布尔值。我需要标志在两次启动之间保持不变,这样我们就不必在每次应用程序重新启动时都覆盖核心表
如果即使用户从他的设备上删除了您的应用程序,您也想要持久数据,请使用:
NSKeyedArchiver
NSKeyedUnarchiver
这是一个很好的库:JNKeychain。
您可以在此处找到代码源:https://github.com/jeremangnr/JNKeychain
创建一个新的class,里面有静态class方法,这里是一个使用JNKeychain的例子,我们添加然后删除一个key/value到钥匙链:
#pragma mark - Keychain exemple -
+ (void)JNKExemple
{
NSString *testKey = @"myTestKey";
NSString *testValue = @"myTestValue";
if ([JNKeychain saveValue:testValue forKey:testKey]) {
NSLog(@"Correctly saved value '%@' for key '%@'", testValue, testKey);
} else {
NSLog(@"Failed to save!");
}
NSLog(@"Value for key '%@' is: '%@'", testKey, [JNKeychain loadValueForKey:testKey]);
if ([JNKeychain deleteValueForKey:testKey]) {
NSLog(@"Deleted value for key '%@'. Value is: %@", testKey, [JNKeychain loadValueForKey:testKey]);
} else {
NSLog(@"Failed to delete!");
}
}
毫无疑问,这样做的方法是使用 NSUserDefaults
。我建议使用 plist,然后使用该文件的内容调用 registerDefaults()
,而不是对 AppDelegate 中的值进行硬编码。
我不建议您使用核心数据实体来保存用户默认值。这真的不是对象图的用途。 (从性能的角度来看,没有区别:NSUserDefaults
正在使用 SQLite,你的 Core Data 存储可能也是如此。)
顺便说一句,plist 通常也是一种用实际数据(例如示例条目)为数据库适当播种的好方法。
我需要在我的应用程序首次加载时使用一些 'core' 表为我的数据库做种。在我的 AppDelegate 中使用 NSUserDefaults 的最佳方法是:
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
NSUserDefaults.standardUserDefaults().registerDefaults([
"hasSeededCoreTables": false
])
return true
}
或者我应该在核心数据中创建一个 'Settings' 实体并在其中设置一个布尔值。我需要标志在两次启动之间保持不变,这样我们就不必在每次应用程序重新启动时都覆盖核心表
如果即使用户从他的设备上删除了您的应用程序,您也想要持久数据,请使用:
NSKeyedArchiver
NSKeyedUnarchiver
这是一个很好的库:JNKeychain。 您可以在此处找到代码源:https://github.com/jeremangnr/JNKeychain
创建一个新的class,里面有静态class方法,这里是一个使用JNKeychain的例子,我们添加然后删除一个key/value到钥匙链:
#pragma mark - Keychain exemple -
+ (void)JNKExemple
{
NSString *testKey = @"myTestKey";
NSString *testValue = @"myTestValue";
if ([JNKeychain saveValue:testValue forKey:testKey]) {
NSLog(@"Correctly saved value '%@' for key '%@'", testValue, testKey);
} else {
NSLog(@"Failed to save!");
}
NSLog(@"Value for key '%@' is: '%@'", testKey, [JNKeychain loadValueForKey:testKey]);
if ([JNKeychain deleteValueForKey:testKey]) {
NSLog(@"Deleted value for key '%@'. Value is: %@", testKey, [JNKeychain loadValueForKey:testKey]);
} else {
NSLog(@"Failed to delete!");
}
}
毫无疑问,这样做的方法是使用 NSUserDefaults
。我建议使用 plist,然后使用该文件的内容调用 registerDefaults()
,而不是对 AppDelegate 中的值进行硬编码。
我不建议您使用核心数据实体来保存用户默认值。这真的不是对象图的用途。 (从性能的角度来看,没有区别:NSUserDefaults
正在使用 SQLite,你的 Core Data 存储可能也是如此。)
顺便说一句,plist 通常也是一种用实际数据(例如示例条目)为数据库适当播种的好方法。