代码之家  ›  专栏  ›  技术社区  ›  cdnicoll

iPhone JSON对象

  •  1
  • cdnicoll  · 技术社区  · 16 年前

    我试图创建一个应用程序,从HTTP请求中检索JSON数据,将其作为JSON对象发送到应用程序主控制器,然后从那里对其进行进一步处理。

    我的重点是创建一个类,这个类将作为一个JSON类,在这个类中获取URL、获取数据并返回该对象。

    单独地,我能够使这个类工作,但是我不能让这个类存储我的主控制器检索的对象。

    因为我对Objective-C本身还比较陌生,所以我的想法是我在初始化调用中搞砸了:

    -initWithURL:(NSString *) value
    {
        responseData = [[NSMutableData data] retain];
        NSURL *theURL = [NSURL URLWithString:value];
    
        NSURLRequest *request = [NSURLRequest requestWithURL:theURL];
        [[NSURLConnection alloc] initWithRequest:request delegate:self];
    
        return self;
    }
    

    JSON对象的处理在这里进行:

    - (void)connectionDidFinishLoading:(NSURLConnection *)connection {
        [connection release];
    
        NSString *responseString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
        [responseData release];
    
        NSError *jsonError;
        SBJSON *json = [[SBJSON new] autorelease];
        NSDictionary *parsedJSON = [json objectWithString:responseString error:&jsonError];
    
        // NSArray object.
        listings = [parsedJSON objectForKey:@"posts"];
        NSEnumerator *enumerator = [listings objectEnumerator];
        NSDictionary* item;
    
        // to prove that it does work.
        while (item = (NSDictionary*)[enumerator nextObject]) {
            NSLog(@"posts:id = %@", [item objectForKey:@"id"]);
            NSLog(@"posts:address = %@", [item objectForKey:@"address"]);
            NSLog(@"posts:lat = %@", [item objectForKey:@"lat"]);
            NSLog(@"posts:lng = %@", [item objectForKey:@"lng"]);
        }
    
        [responseString release];
    
    }
    

    现在在主控制器中调用对象时,我在viewDidLoad方法调用中有以下代码:

    - (void)viewDidLoad {
        [super viewDidLoad];
    
        JSON_model *jsonObj = [[JSON_model alloc] initWithURL:@"http://localhost/json/faith_json.php?user=1&format=json"];
    
        NSEnumerator *enumerator = [[jsonObj listings] objectEnumerator];
        NSDictionary* item;
        //  
        while (item = (NSDictionary*)[enumerator nextObject]) {
            NSLog(@"posts:id = %@", [item objectForKey:@"id"]);
            NSLog(@"posts:address = %@", [item objectForKey:@"address"]);
            NSLog(@"posts:lat = %@", [item objectForKey:@"lat"]);
            NSLog(@"posts:lng = %@", [item objectForKey:@"lng"]);
        }
    }
    
    3 回复  |  直到 16 年前
        1
  •  0
  •   Dwight Kelly    16 年前
        2
  •  0
  •   Twelve47    16 年前

    我认为事情发生的顺序不对。

    1. 从viewDidLoad调用[JSON\ Model initWithURL]
    2. initWithURL开始异步获取数据。
    3. initWithURL完成并返回viewDidLoad。

    ... 当服务器生成并返回JSON时,时间就过去了。

    1. 一旦iPhone接收到数据,就会调用connectiondifinishload
    2. 无法再次访问列表

    一旦JSON数据被加载和解析,视图就不会被告知刷新。

        3
  •  0
  •   Gavy    14 年前

    我发现 this 有助于在我的应用程序中使用JSON对象的网站。