2014-02-15 16 views
0

我有NSURLConnectionDataDelegate的一個奇怪的問題。 我已經創建瞭解析json的類。 下面的代碼:Objective-C JSON解析不能在其他類中工作

- (void)createJSONDictionaryFromURL:(NSURL *)url 
{ 
    NSURLRequest *request = [NSURLRequest requestWithURL:url]; 
    (void)[[NSURLConnection alloc] initWithRequest:request delegate:self]; 
} 

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response 
{ 
    jsonData = [[NSMutableData alloc] init]; 
} 

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 
{ 
    [jsonData appendData:data]; 
} 

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error 
{ 
    NSLog(@"Fail with error"); 
} 

- (void)connectionDidFinishLoading:(NSURLConnection *)connection 
{ 
    self.jsonDictionary = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:nil]; 
    NSLog(@"%@", self.jsonDictionary); 
} 

在方法connectionDidFinishLoading,就是一切正確,控制檯顯示正確的數據。 但我想在我的ViewController的viewDidLoad方法中使用它。

JSONParser *parser = [[JSONParser alloc] init]; 
NSDictionary *dict = [[NSDictionary alloc] init]; 
[parser createJSONDictionaryFromURL:url]; 
dict = parser.jsonDictionary; 

NSLog(@"%@", dict); 

控制檯顯示(null),任何人都可以幫助我嗎?

對不起我的英文不好

回答

1

JSONParser是因爲網絡連接(這是異步)異步。所以,當你打電話給parser.jsonDictionary時,你會發現數據尚未準備好。

在數據可用之前,您不想嘗試阻止,而是應該設置回調以在數據準備就緒時將數據傳送到視圖控制器(以便您可以保存並更新UI)。

這可以通過將delegate屬性添加到JSONParser並讓視圖控制器分配自己並實現一些回調方法來完成。或者,使用較少的代碼,JSONParser可以提供視圖控制器設置的塊屬性,並在connectionDidFinishLoading:中調用該屬性(確保@property使用(複製,非原子)``)。