NSUserDefaults 不会一致地加载数据 [英] NSUserDefaults will not load data consistently

查看:74
本文介绍了NSUserDefaults 不会一致地加载数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

-(void)viewWillAppear:(BOOL)animated{[super viewWillAppear:animated];[自重载数据];}-(void)reloadData {//加载所有数据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"];}

解决方案

当使用 NSUserDefaults 时,最好在写入数据后调用 -synchronize.>

举个例子:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];[默认 setObject:@100 forKey:@"SomeKey"];[默认同步];//这将确保写入数据.

如果您不调用此方法,系统会定期调用.但是,它可能会导致您可能遇到的时间问题.

阅读有关 NSUserDefaults 和此行为的更多信息 此处.

更新

现在我认为这个问题正在失去它的上下文.这是您在下面的评论中发布的更新方法.可能值得发布一个后续问题,因为这可能不是 NSUserDefaults 的问题.

这里至少是一个使用 NSUserDefaults 写出数据的例子.由于正在执行乘法,我还更新了您的方法以将 priceFarmHands 保存为浮点数.(之前它被写成一个整数,可能被截断了).

- (void)buyFarmhand {农场手++;totalApples -= priceFarmHands;如果(价格农场手 <1000){priceFarmHands = priceFarmHands * 1.35;} else if(priceFarmHands <10000) {priceFarmHands = priceFarmHands * 1.25;} 别的 {priceFarmHands = priceFarmHands * 1.15;}NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];[默认 setFloat:priceFarmHands forKey:@"priceFarmHands"];[默认 setInteger:farmHands forKey:@"farmHands"];[默认 setDouble:totalApples forKey:@"totalApples"];[默认同步];[self setText:[NSString stringWithFormat:@"%.f", priceFarmHands] withExistingAttributesInLabel:self priceFarmHandsLabel];[self setText:[NSString stringWithFormat:@"%d", farmHands] withExistingAttributesInLabel:self.numberFarmhands];}

I have a tab-based application and want to reload data each time I switch between the tabs. So I used viewWillAppear: which gets called but the data doesn't reload. Could this be a result of using lots of [NSUserDefault]'s? Here is my code:

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

解决方案

When using NSUserDefaults it is a good idea to call -synchronize after writing the data.

Take the following example:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

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

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

If you do not call this method the system periodically does. However it can lead the timing issues like you are probably experiencing.

Read more about NSUserDefaults and this behavior here.

Update

This question is losing its context now I think. Here is an updated method that you posted below in the comments. It might be worth posting a follow up question since this is probably not an issue with NSUserDefaults.

Here at least for posterity is an example of using NSUserDefaults to write out data. I also updated your method to save priceFarmHands as a float because of the multiplication being performed. (It was being written out as an integer before and probably being truncated).

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

这篇关于NSUserDefaults 不会一致地加载数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆