iOS NSUserDefaults 加载缓慢

标签 ios nsuserdefaults uisegmentedcontrol viewdidappear

我正在使用 NSUSerDefaults 为我的应用程序存储几个字符串和整数。每当打开 View 时,字符串的加载速度都比 View 慢,因此您会看到一个故障。例如,我保存了 selectedSegmentIndex,然后在 viewDidAppear 中读取它,在调用 View 时的一瞬间,没有选择段,然后选择了正确的段。您如何做到这一点,以便在打开 View 和读取设置之间没有时间间隔?

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

最佳答案

默认值并不慢,你只是加载数据太迟了。填充 View 的标准位置是在 View Controller 中的 -viewDidLoad-viewWillAppear 中。两者都会尽快更新 View 以避免视觉故障。如果两者中的任何一个都不适合您,请引用以下提示来找出原因:

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

    static NSString *const SelectedSegmentKey = @"selectedSegment";
    
  • 如果一切都失败了,请为您的 unitSegmentControl 使用自定义 UISegmentControl 子类,并在 -setSelectedSegmentIndex 中放置一个断点以查看谁否则可能会调用它。

关于iOS NSUserDefaults 加载缓慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13996159/

相关文章:

ios - NSUserDefaults 不适用于 Swift 中的 UITableView

ios - React-Native:更新后如何删除 NSUserDefaults?

ios - UIView 中的 UISegmentedControl 不响应更改事件

ios - 从 CoreData 中解包 Date() 类型的选项?

ios - 当键盘快速出现时 UICollectionViewCell 改变高度 4.2

iphone - 无法加载英文本地化文件

ios - 从 CloudKit 中获取多个记录类型

ios - 如何在 UITextView 中显示 NSArray

ios - 应用程序关闭后不保存用户默认值

ios - UIButton 执行 UISegment 控件操作