2014-02-26 2 views
1

서버에서 데이터를 가져 오는 데 사용되는 클래스가 있습니다. 내 서버에서 반환 된 데이터는 JSON에 있습니다. 어떤 이유 때문에 didReceiveData가 전혀 실행되지 않습니다. 테스트를 위해 NSLog를 배치했지만 아무 것도하지 않습니까?didReceiveData 함수가 작동하지 않는 이유

+(NSJSONSerialization *) getTask:(id)task_id{ 

    NSString *post = [NSString stringWithFormat:@"&task_id=%@", task_id]; 

    NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES]; 
    NSString *postLength = [NSString stringWithFormat:@"%lu",(unsigned long)[postData length]]; 
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; 
    [request setURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://my-server.com/"]]]; 
    [request setHTTPMethod:@"POST"]; 
    [request setValue:postLength forHTTPHeaderField:@"Content-Length"]; 
    [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Current-Type"]; 
    [request setHTTPBody:postData]; 

    NSURLConnection *conn = [[NSURLConnection alloc]initWithRequest:request delegate:self]; 

    if(conn){ 
     NSLog(@"Testing"); 
    } 

    return json; 
} 

// Log the response for debugging 
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData*)data { 
    NSLog(@"test"); 
    NSString *jsonString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 
    NSData *jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding]; 
    json = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:nil]; 
} 

// Declare any connection errors 
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { 
    NSLog(@"Error: %@", error); 
} 

감사합니다,

피터 당신은 연결을 시작하는 데 필요한

+0

NSURLConnection이 * 비동기 적으로 작동하기 때문에 * getTask : 메서드에서받은 JSON을 * 리턴 할 수 없다는 것에주의하십시오. - 아마도'getTask :'에서 리턴 한 후 연결을 취소 할 것인가? –

+0

잘 모르겠습니다. 그렇다면 NSURLConnection을 클래스에 어떻게 배치 할 수 있습니까? –

+0

위의 코드는 내 앱 전체에 걸쳐 여러 번 사용되기 때문에 클래스에 배치 한 이유는 무엇입니까? –

답변

3

getTask: 클래스 인 self을 의미 클래스 메소드입니다. 따라서 대리자 메서드도 클래스 메서드 여야합니다.

NSURLConnection은 비동기로 작동하므로 getTask: 메서드에서받은 JSON을 반환 할 수 없습니다.

+0

고마워요. 다른 방법이 효과가 있습니다. 이제는 해당 클래스를 처음에 호출하는 UIViewController의 json 변수를 반환하는 방법을 알아야합니다. –

+1

@PeterStuart : 현재 스레드를 차단하지 않고 비동기 메서드를 동기식으로 만들 수 없습니다. - 일반적인 방법은'connectionDidFinishLoading'이 수신 된 데이터로 View Controller를 다시 호출하는 것입니다. 'didReceiveData :'는 데이터 덩어리들과 함께 여러 번 호출 될 수 있음을 주목하라. –

+0

무슨 뜻인지 확실치 않습니다. 도움이 될만한 문서가 있습니까? –

1

:

여기 내 코드입니다. 단지 전화, 시작 방법을

NSURLConnection *conn = [[NSURLConnection alloc]initWithRequest:request delegate:self startImmediately:YES]; 

또는 : 다음 initWithRequest:delegate:startImmediately: 방법을 사용해보십시오

if(conn){ 
    [conn start]; 
} 
+1

나는 그것을 설명한다고 생각하지 않습니다. 문서에 따르면,'initWithRequest : delegate :'는'initWithRequest : delegate : startImmediately :'를 호출하고'startImmediately'에'YES'를 전달하는 것과 같습니다. –

+0

다른 곳에서이 코드를 사용하고 자동으로 시작하지만, 클래스에서 처음 사용하기 때문에 그럴 수도 있습니다. 다시보고 할게. 감사합니다 –

+0

두 가지 방법 모두 시도하고 아무것도 작동하지? –

관련 문제