在Swift中存储应用程序设置

时间:2015-08-11 11:15:31

标签: swift design-patterns core-data

我需要在第一次加载应用程序时使用一些“核心”表来为我的数据库建立种子。是我在AppDelegate中使用NSUserDefaults的最佳方法:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    NSUserDefaults.standardUserDefaults().registerDefaults([
        "hasSeededCoreTables": false

        ])
    return true
}

或者我应该在核心数据中创建一个“设置”实体并在其中设置一个布尔值。我需要在启动之间保持标志,以便每次应用程序重新启动时都不必覆盖核心表

2 个答案:

答案 0 :(得分:1)

毫无疑问,这样做的方法是使用NSUserDefaults。我建议使用plist,然后使用该文件的内容调用registerDefaults(),而不是对AppDelegate中的值进行硬编码。

我不建议您使用Core Data实体来保留用户默认值。这真的不是对象图的用途。 (从性能角度来看,没有区别:NSUserDefaults正在使用SQLite,并且可能是您的Core Data存储。)

顺便说一句,plist通常也是使用实际数据(例如样本条目)正确播种数据库的好方法。

答案 1 :(得分:0)

如果您想要持久数据,即使用户从他的设备中删除了您的应用,也使用了:

NSKeyedArchiver
NSKeyedUnarchiver

这是一个很好的lib:JNKeychain。 您可以在此处找到代码来源:https://github.com/jeremangnr/JNKeychain

在里面创建一个带有静态类方法的新类,这里是一个使用JNKeychain的例子,我们添加然后我们删除键链的键/值:

#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!");
    }
}