2010-04-22 50 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對象。