将NSUserDefaults的不一致加载数据(NSUserDefaults will not lo

2019-10-30 05:58发布

我有一个基于标签的应用程序 ,并希望每一个我在标签之间切换时重新加载数据 。 所以我用viewWillAppear:它被调用,但数据不会重新加载。 难道这是使用大量的结果[NSUserDefault]的? 这里是我的代码:

-(void)viewWillAppear:(BOOL)animated{
    [super viewWillAppear:animated];
    [self reloadData];
}

-(void)reloadData {

    //Loading all the data
    totalApples = [[NSUserDefaults standardUserDefaults]integerForKey:@"totalApples"];
    [self setText:[NSString stringWithFormat:@"%.01f", totalApples] withExistingAttributesInLabel:self.applesLabel];

    applesPerSecond = [[NSUserDefaults standardUserDefaults]integerForKey:@"applesPerSecond"];
    [self setText:[NSString stringWithFormat:@"%.01f", applesPerSecond] withExistingAttributesInLabel:self.applesPerSecondLabel];

    applesPerClick = [[NSUserDefaults standardUserDefaults]integerForKey:@"applesPerClick"];
}

Answer 1:

使用时NSUserDefaults它是一个好主意,打电话-synchronize写入数据之后。

看看下面的例子:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

[defaults setObject:@100 forKey:@"SomeKey"];

[defaults synchronize]; //This will ensure data is written.

如果你不调用这个方法,系统定期执行。 然而,它可能会导致时序问题,如你可能遇到。

了解更多关于NSUserDefaults这种行为在这里 。

更新

这个问题正在失去它的上下文,现在我的想法。 下面是你在评论贴在下面的更新方法。 因为这可能不是一个问题,这可能是值得张贴跟进质询, NSUserDefaults

这里至少为后代是使用的一个例子NSUserDefaults写出来的数据。 我也更新了你的方法,因为乘法被执行priceFarmHands保存为浮动。 (它被写了作为一个整数,可能被截断之前)。

- (void)buyFarmhand {
    farmHands++;
    totalApples -= priceFarmHands;

    if(priceFarmHands < 1000) {
        priceFarmHands = priceFarmHands * 1.35;
    } else if(priceFarmHands < 10000) {
        priceFarmHands = priceFarmHands * 1.25;
    } else {
        priceFarmHands = priceFarmHands * 1.15;
    }

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

    [defaults setFloat:priceFarmHands forKey:@"priceFarmHands"];
    [defaults setInteger:farmHands forKey:@"farmHands"];
    [defaults setDouble:totalApples forKey:@"totalApples"];

    [defaults synchronize];

    [self setText:[NSString stringWithFormat:@"%.f", priceFarmHands] withExistingAttributesInLabel:self priceFarmHandsLabel];
    [self setText:[NSString stringWithFormat:@"%d", farmHands] withExistingAttributesInLabel:self.numberFarmhands];
}


Answer 2:

我没有看到你创造,它应该在reloadData方法创建的NSUserdefault对象,这应该工作:

-(void)reloadData {
    //Loading all the data
    NSUserDefaults *appleData = [NSUserDefaults standardUserDefaults];
    totalApples = [appleData integerForKey:@"totalApples"];
    applesPerSecond = [appleData integerForKey:@"applesPerSecond"];
    applesPerClick = [integerForKey:@"applesPerClick"];

    //Set the labels text
    [self setText:[NSString stringWithFormat:@"%.01f", totalApples] 
                    withExistingAttributesInLabel:self.applesLabel];
    [self setText:[NSString stringWithFormat:@"%.01f", applesPerSecond] 
               withExistingAttributesInLabel:self.applesPerSecondLabel];
}

还帮你解决这个添加一些日志viewWillAppear

-(void)viewWillAppear:(BOOL)animated{
    NSLog(@"viewWillAppear called, reloadind data...");
    [super viewWillAppear:animated];
    [self reloadData];
}


文章来源: NSUserDefaults will not load data consistently