iOS NSUserDefaults加载速度慢

iOS NSUserDefaults加载速度慢,ios,nsuserdefaults,uisegmentedcontrol,viewdidappear,Ios,Nsuserdefaults,Uisegmentedcontrol,Viewdidappear,我正在使用NSUSerDefaults为我的应用程序存储一对字符串和整数。无论何时打开视图,字符串的加载速度都比视图慢,因此您会看到一个小故障。例如,我保存selectedSegmentIndex,然后在ViewDidDisplay中读取它。当调用视图时,没有选择任何段,然后选择正确的段。如何使打开的视图和读取的设置之间没有时间间隔 - (void)viewDidLoad { [super viewDidLoad]; int segmentIndex = [[NSUserDef

我正在使用NSUSerDefaults为我的应用程序存储一对字符串和整数。无论何时打开视图,字符串的加载速度都比视图慢,因此您会看到一个小故障。例如,我保存selectedSegmentIndex,然后在ViewDidDisplay中读取它。当调用视图时,没有选择任何段,然后选择正确的段。如何使打开的视图和读取的设置之间没有时间间隔

- (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];
}

默认设置并不慢,只是加载数据太晚了。填充视图的标准位置是在视图的控制器中的
-viewDidLoad
-viewwill
中。两者都将很快更新视图,以避免出现视觉故障。如果这两种方法中的任何一种都不适用于您,以下是一些查找原因的提示:

  • 尝试将所选索引设置为硬连线数字。这将告诉您问题是在默认设置中还是(更可能)在
    -setSelectedSegmentIndex
    调用中
  • 将UI填充代码移动到
    -视图将出现
    。这是在显示UI之前更新UI的最新时刻
  • 使用
    NSParameterAssert
    确保
    unitSegmentControl
    不是
    nil
  • 确保从默认值读回的索引是预期的数字。通常,最好将默认键拉入常量。这样你就不会碰到简单的打字错误:

    static NSString *const SelectedSegmentKey = @"selectedSegment";
    
  • 如果其他所有操作都失败,请为您的
    unitSegmentControl
    使用自定义的
    UISegmentControl
    子类,并在
    -setSelectedSegmentIndex
    中放置一个断点,以查看还有谁在调用它


好吧,当我将代码放在这两种方法中的任何一种中时,它根本不起作用。那么你就做错了什么。如果没有看到代码,很难说什么。您可以在上复制问题吗?加载视图时是否使用[[NSUserDefaults standardUserDefaults]synchronize]?更改段时使用synchronize,这肯定会使应用程序变慢,因为它会将您的对象直接写入磁盘。是否要修复慢度?不,它不慢。我需要的应用程序写入数据,一旦段被选中。它不会加载数据,尽管在viewDidLoad中是我的问题状态请检查!为你做的特别的