iOS NSUserDefaults加载缓慢

时间:2012-12-21 19:37:22

标签: ios nsuserdefaults uisegmentedcontrol viewdidappear

我正在使用NSUSerDefaults为我的应用程序存储一些字符串和整数。无论何时打开视图,字符串的加载速度都比视图慢,因此您会看到一个小故障。例如,我保存selectedSegmentIndex,然后在viewDidAppear中读取它,并且在调用视图的快速时刻,没有选择任何段,然后右侧选择。你怎么做到这样,打开的视图和设置被读取之间没有时间差距?

- (void)viewDidLoad
{
    [super viewDidLoad];

    int segmentIndex = [[NSUserDefaults standardUserDefaults] integerForKey:@"selectedIndex"];
    unitSegmentControl.selectedSegmentIndex = segmentIndex;

    BOOL location = [[NSUserDefaults standardUserDefaults] boolForKey:@"locationManager"];
    [gpsSwitch setOn:location animated:NO];

    deviceID.text =  [[NSUserDefaults standardUserDefaults] stringForKey:@"DeviceID"];

}


- (IBAction)changeSeg:(id)sender {

    if (unitSegmentControl.selectedSegmentIndex == 0) {
        [[NSUserDefaults standardUserDefaults] setObject:@"http://98.246.50.81/firecom/xml/units/E01.xml" forKey:@"parserURL"];
        [[NSUserDefaults standardUserDefaults] setObject:@"Hillsboro Main" forKey:@"selectedStation"];
        [[NSUserDefaults standardUserDefaults] setObject:@"Hillsboro Fire & Rescue" forKey:@"selectedDepartment"];
    }
    if (unitSegmentControl.selectedSegmentIndex == 1) {
        [[NSUserDefaults standardUserDefaults] setObject:@"http://98.246.50.81/firecom/xml/units/E02.xml" forKey:@"parserURL"];
        [[NSUserDefaults standardUserDefaults] setObject:@"Hillsboro Witch Hazel" forKey:@"selectedStation"];
        [[NSUserDefaults standardUserDefaults] setObject:@"Hillsboro Fire & Rescue" forKey:@"selectedDepartment"];
    }
    [[NSUserDefaults standardUserDefaults] setInteger:unitSegmentControl.selectedSegmentIndex forKey:@"selectedIndex"];
    [[NSUserDefaults standardUserDefaults] synchronize];
}

1 个答案:

答案 0 :(得分:3)

默认值并不慢,您只是加载数据太晚了。填充视图的标准位置在视图控制器的-viewDidLoad-viewWillAppear中。两者都会很快更新视图以避免视觉故障。如果这两个中的任何一个对你不起作用,这里有一些提示可以找到原因:

  • 尝试将所选索引设置为硬连线数字。这将告诉您问题是在默认情况下还是(更有可能)在-setSelectedSegmentIndex电话中。
  • 将UI人口代码移至-viewWillAppear。这是在UI显示之前更新UI的最新时刻。
  • 使用NSParameterAssert确保unitSegmentControl不是nil
  • 确保从默认值读回的索引是预期的数字。通常,最好将默认键拉入常量。这样你就不会遇到简单的拼写错误:

    static NSString *const SelectedSegmentKey = @"selectedSegment";
    
  • 如果其他所有方法都失败了,请为UISegmentControl使用自定义unitSegmentControl子类,并在-setSelectedSegmentIndex中放置一个断点,以查看其他人可能正在调用它。