【问题标题】:User defaults not saving用户默认不保存
【发布时间】:2013-07-11 05:27:53
【问题描述】:

我刚刚构建了我的第一个应用程序,只剩下一件事要做。我正在从 url 获取数据。如果该 URL 失败或为零,那么我想从用户默认值中获取数据。

我有一个功能可以从 URL 的数据中保存用户默认值

- (void)saveToUserDefaults
{
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setObject:data forKey:@"data"];
    [defaults synchronize];
}

这是我的更多代码。

NSURL *url = [NSURL URLWithString:@"http://jamessuske.com/isthedomeopen/isthedomeopenGetData.php"];
        data = [NSData dataWithContentsOfURL:url options:0 error:nil];
        [self saveToUserDefaults];
        if(url == nil){
            NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
            data = [defaults dataForKey:@"data"];
        }
        NSArray *array = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];

我断开了互联网连接并在模拟器中运行了我的应用,但我的应用返回了空值。

我能做些什么来解决这个问题?

【问题讨论】:

  • 这个问题与Xcode无关。 Xcode 是您用于开发应用程序的 IDE,这是一个纯粹与代码相关的问题。
  • @dandan78 你是我的英雄!
  • @h2 哈哈!事实上,是你让我开始做这件事的。每个人都必须尽自己的一份力量来保持网站的清洁。
  • 在真机上测试
  • @WolfLink 不幸的是,这不是唯一的情况。人们一直在错误地标记问题,而且他们也一直不知道 IDE、语言、编译器、库和应用程序之间的区别。

标签: iphone objective-c nsuserdefaults


【解决方案1】:

在你的场景中试试这个

// 用于检查网络是否可用的方法

  - (BOOL)isNetworkAvailable
    {
   BOOL connected;
const char *host = "www.apple.com";
SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithName(NULL, host);
SCNetworkReachabilityFlags flags;
connected = SCNetworkReachabilityGetFlags(reachability, &flags);
isConnected = NO;
isConnected = connected && (flags & kSCNetworkFlagsReachable) && !(flags & kSCNetworkFlagsConnectionRequired);
CFRelease(reachability);
    return isConnected;
}

}

now try to check

        NSURL *url = [NSURL URLWithString:@"http://jamessuske.com/isthedomeopen/isthedomeopenGetData.php"];
                data = [NSData dataWithContentsOfURL:url options:0 error:nil];

        bool networkStatus = [self isNetworkAvailable];
                if(networkStatus){
                     [self saveToUserDefaults];
                }
    else
    {
     NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
                    data = [defaults objectForKey:@"data"];
    }
                NSArray *array = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];

【讨论】:

  • 您帮了大忙,谢谢。但你上面的代码给了我一个警告_bridge casts have no effect when not using ARC
  • 而且在 xcode 中,当我尝试运行我的脚本时,它说构建失败。
  • 架构 i386 的未定义符号:“_CFNetDiagnosticCopyNetworkStatusPassively”,引用自:ViewController.o 中的-[ViewController isNetworkAvailable] “_CFNetDiagnosticCreateWithURL”,引用自:ViewController.o 中的-[ViewController isNetworkAvailable] ld:符号( s) 未找到架构 i386 clang:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)
  • import #import 标头并尝试最新方法
  • isConnected 假设是NSString?它没有声明
【解决方案2】:

试试这个

- (void)saveToUserDefaults
{
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setObject:data forKey:@"data"];

}

NSURL *url = [NSURL URLWithString:@"http://jamessuske.com/isthedomeopen/isthedomeopenGetData.php"];
        data = [NSData dataWithContentsOfURL:url options:0 error:nil];
        [self saveToUserDefaults];
        if(url == nil){
            NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
            data = [defaults objectForKey:@"data"];
        }
        NSArray *array = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];

【讨论】:

  • 所以你所做的只是删除对“同步”的调用?
  • 不仅是同步方法。这里的问题是他为对象设置值 [defaults setObject:data forKey:@"data"];但进入相同的数据类型方法
【解决方案3】:

试试这个。

NSURL * url = [NSURL URLWithString:@"http://jamessuske.com/isthedomeopen/isthedomeopenGetData.php"];

NSURLRequest * request = [NSURLRequest requestWithURL:url];

NSOperationQueue * newQueue = [[NSOperationQueue alloc] init];

[NSURLConnection sendAsynchronousRequest:request
                                   queue:newQueue
                       completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {

                               dispatch_async(dispatch_get_main_queue(), ^{

                                   NSArray * array = nil;

                                   NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

                                   if (error == nil) {

                                       array = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];

                                       [defaults setObject:array forKey:@"data"];

                                   } else {

                                       array = [defaults objectForKey:@"data"];

                                   }

                                   NSLog(@"%@", array);

                               });

                           }];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多