2014-02-15 2 views
0

NSURLConnectionDataDelegate에 이상한 문제가 있습니다. json의 구문 분석을위한 클래스를 만들었습니다. 다음 코드 : 메서드 connectionDidFinishLoading에서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); 
} 

은 콘솔이 올바른 데이터를 보여주고, 모든 것을 정확합니다. 그러나이 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를 업데이트 할 수 있음).

JSONParserdelegate 속성을 추가하고보기 컨트롤러가 자체 할당하고 콜백 메소드를 구현함으로써 수행 할 수 있습니다. 또는 적은 코드를 사용하여 JSONParser은보기 컨트롤러가 설정하고 connectionDidFinishLoading:에서 호출되는 블록 속성을 제공 할 수 있습니다 (@property이 (copy, nonatomic)을 사용하는지 확인하십시오)).

관련 문제