变更记录

序号 录入时间 录入人 备注
1 2016-06-16 Alfred Jiang -

方案名称

语法 - 通过 registerDefaults 实现单次记录需求

关键字

语法 \ NSUserDefaults \ registerDefaults \ 单次记录

需求场景

  1. 需要实现单次记录的需求场景,避免重复赋值与重复记录

参考链接

  1. CSDN - iOS: NSUserDefaults issues

详细内容

registerDefaults 方法调用时会先检查 NSUserDefaults 中是否已经存在相同的 Key ,如果存在则不会把其覆盖。
该特性可以很好的用于记录单次运行的需求,当某 Key 已经被赋值后,避免重复赋值和多次赋值。

示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// [NSUserDefaults standardUserDefaults] 不包含 TEST_KEY
NSLog(@"Log 0 : %@",[[NSUserDefaults standardUserDefaults] objectForKey:TEST_KEY]);

// 通过 registerDefaults: 设置 TEST_KEY 值为 @"TEST_VALUE_0"
NSDictionary *defaultValues0 = [NSDictionary dictionaryWithObjectsAndKeys: @"TEST_VALUE_0", TEST_KEY,nil];
[[NSUserDefaults standardUserDefaults] registerDefaults:defaultValues0];

// 此时 TEST_KEY 值为 @"TEST_VALUE_0"
NSLog(@"Log 1 : %@",[[NSUserDefaults standardUserDefaults] objectForKey:TEST_KEY]);

// 通过 setObject:forKey: 变更 TEST_KEY 值为 @"TEST_VALUE_1"
[[NSUserDefaults standardUserDefaults] setObject:@"TEST_VALUE_1" forKey:TEST_KEY];
[[NSUserDefaults standardUserDefaults] synchronize];

// 此时 TEST_KEY 值为 @"TEST_VALUE_1"
NSLog(@"Log 2 : %@",[[NSUserDefaults standardUserDefaults] objectForKey:TEST_KEY]);

// 通过 registerDefaults: 尝试变更 TEST_KEY 值为 @"TEST_VALUE_2"
NSDictionary *defaultValues1 = [NSDictionary dictionaryWithObjectsAndKeys: @"TEST_VALUE_2", TEST_KEY,nil];
[[NSUserDefaults standardUserDefaults] registerDefaults:defaultValues1];

// 此时 TEST_KEY 值仍然为 @"TEST_VALUE_1"
NSLog(@"Log 3 : %@",[[NSUserDefaults standardUserDefaults] objectForKey:TEST_KEY]);

输出内容:

1
2
3
4
2016-06-16 19:50:35.708 testregisterdefaults[34268:3677309] Log 0 : (null)
2016-06-16 19:50:35.709 testregisterdefaults[34268:3677309] Log 1 : TEST_VALUE_0
2016-06-16 19:50:35.713 testregisterdefaults[34268:3677309] Log 2 : TEST_VALUE_1
2016-06-16 19:50:35.713 testregisterdefaults[34268:3677309] Log 3 : TEST_VALUE_1

效果图

(无)

备注

(无)