2010-04-22 65 views
1

我想创建一个应用程序,它将从HTTP请求中检索JSON数据,并将其作为JSON对象发送给应用程序主控制器,然后再从中进行进一步处理。iPhone JSON对象

我坚持的地方实际上是创建一个类,它将用作一个JSON类,在该类中将获取URL,获取数据并返回该对象。

独自一人,即使能够使这个类的工作,但我不能让类来存储我的主控制器的对象来检索它。

因为IM相当新的Objective-C的本身,我的想法是,即时通讯搞乱了我的init调用内:

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

回答

0

我认为事情发生的顺序是错误的。

  1. 输入viewDidLoad中
  2. [JSON_Model initWithURL]被称为从viewDidLoad中
  3. initWithURL开始异步获取数据。
  4. initWithURL结束并返回到viewDidLoad。
  5. viewDidLoad中继续,并显示列表

的空内容......时光流逝而服务器生成的JSON并返回。

一旦iPhone临危数据
  • connectionDidFinishLoading填充列表与JSON数据
  • connectionDidFinishLoading被调用。
  • 列表不再次访问
  • 的观点从来没有告诉过一次的JSON数据被加载和分析刷新。

    0

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