NSUserdefaults在应用程序重新启动之前不会更新

时间:2014-04-02 07:54:40

标签: ios iphone objective-c json

我正在从网址中传入json数据并将其中一个值传递给NSUserdefaults以将其用于应用程序视图。

示例用户将输入一个给他的唯一代码,此代码将附加到请求的URL,并根据所请求的代码更改json值。 目前,当我输入代码时,它正在获取并保存NSuserdefaults并将其传递给视图中的标签。但是当我输入新代码并确定新数据时,它不会在视图中更新。如果我重新启动应用程序并输入新代码,那么它将显示新值。有人可以帮助我。这是代码

NSString *jsonUrlString = [[NSString alloc] initWithFormat:@"http://mywebsite.com/json/code.php?user=%@",_opcodeField.text];
NSURL *url = [NSURL URLWithString:[jsonUrlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];

NSURLRequest *request = [[NSURLRequest alloc]initWithURL:url];
[_indicator startAnimating];
_indicator.hidesWhenStopped = YES;
NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:nil];

    //-- JSON Parsing
   NSMutableArray *result = [NSJSONSerialization JSONObjectWithData:responseData options:NSJSONReadingMutableContainers error:nil];
   NSLog(@"settings = %@",result);

    for (NSDictionary *dic in result)
    {
            [[NSUserDefaults standardUserDefaults] setObject:[dic objectForKey:@"footer"] forKey:@"op_footer"];
            [[NSUserDefaults standardUserDefaults] synchronize];

       [_indicator performSelectorOnMainThread:@selector(stopAnimating) withObject:nil waitUntilDone:YES];
    }

查看代码是:

(void)viewDidLoad {
    [super viewDidLoad];
    _Footer.text = [[NSUserDefaults standardUserDefaults] objectForKey:@"op_footer"];

如何在不重新启动应用程序的情况下显示新值。是否有任何代码可以添加到视图中?我可以看到当用户输入新代码时,json正在获取正确的新值

谢谢。

4 个答案:

答案 0 :(得分:0)

您确定viewDidLoad是添加此代码的最佳位置吗?

尝试在一些更频繁调用的方法中添加代码。对于调试,我通常添加一些按钮只是为了调用NSLog来看看会发生什么。

答案 1 :(得分:0)

如果您想要一直加载到viewcontroller,请尝试使用此文件。

- (void)viewWillAppear:(BOOL)animated {
    _Footer.text = [[NSUserDefaults standardUserDefaults] objectForKey:@"op_footer"];
}

或者,如果您想在获取新代码后将其加载到标签,则可以尝试此操作。

- (void)updateLabel {
    _Footer.text = [[NSUserDefaults standardUserDefaults] objectForKey:@"op_footer"];
}

希望这会有所帮助.. :)

答案 2 :(得分:0)

用户默认plist可能需要一些时间来保存和更新。它不会立即发生。在某种暂停后尝试触发呼叫。用按钮测试。

编辑:您可以将观察者添加到默认值,以便您知道它已更新 - Cocoa - Notification on NSUserDefaults value change?

答案 3 :(得分:0)

为什么不移动这条线......

_Footer.text = [[NSUserDefaults standardUserDefaults] objectForKey:@"op_footer"];

到这里(除非当然这是另一个班级)......

NSMutableArray *result = [NSJSONSerialization JSONObjectWithData:responseData options:NSJSONReadingMutableContainers error:nil];
NSLog(@"settings = %@",result);

for (NSDictionary *dic in result)
{
        [[NSUserDefaults standardUserDefaults] setObject:[dic objectForKey:@"footer"] forKey:@"op_footer"];
        [[NSUserDefaults standardUserDefaults] synchronize];

   [_indicator performSelectorOnMainThread:@selector(stopAnimating) withObject:nil waitUntilDone:YES];
}

//Update it straight away
_Footer.text = [[NSUserDefaults standardUserDefaults] objectForKey:@"op_footer"];

还有点困惑为什么你在这里循环词典?有不止一本字典吗?如果有最后一个值将始终是存储在UserDefaults中的值。

您也在循环中停止动画?