在 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 通常也是一种用实际数据(例如示例条目)为数据库适当播种的好方法。