2016-07-20 4 views
0

저는 IOS 개발에 익숙하지 않으므로 일부 기본 사항이 누락되었을 수 있습니다. 이미이 문제로 2 일 동안 고생하고 있습니다. 그래서 여기 있습니다.AFNetworking 3.0을 사용하여 비동기 블록에서 응답을 얻을 수 없습니다.

//request generation, putting url and dictionary into it 

NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; 
AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration]; 

NSURLSessionDataTask *dataTask = [manager dataTaskWithRequest:request completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) { 
    if(!error) 
    { 
     self.jsonDictionary = responseObject; 
     NSInteger HTTPStatusCode = [(NSHTTPURLResponse *)response statusCode]; 
     NSLog(@"RESPONSE DATA: %@", self.jsonDictionary); 
     self.didSendRequest = YES; 
    } 
    else 
    { 
     self.didSendRequest = NO; 
     NSLog(@"ERROR: %@", error); 
    } 
}]; 
[dataTask resume]; 

을 그리고 다음과 같이 JSON 사전을 검색 : 내 API 클래스에서 데이터 작업을

-(NSDictionary *)returnJSON{ 
if(self.didSendRequest) return self.jsonDictionary; 
else NSLog(@"No dictionary dowloaded"); 
return self.jsonDictionary;} 

그럼, 데이터 작업 방법에 URL과 사전을 통과 다른 클래스, 다만이 같은 응답을 얻을 :

-(NSDictionary*)userLogin : (NSString*)email : (NSString*) password { 
dataTaskClass* aph = [[dataTaskClass alloc] init]; 

NSDictionary *userParams = [[NSDictionary alloc] initWithObjectsAndKeys: 
          email,@"email", 
          password,@"password", 
          nil]; 
[aph postRequest: @"myUrl"]; 
return dataTaskClass.returnJSON;} 

을 그리고 마지막으로 나는이처럼 내보기 컨트롤러 클래스에서 호출 :

를 0
//button click method here 
response = [lh userLogin : userEmail : userPass]; 
      if (response) {//do some action} 

그래, 볼 수 있듯이 메서드를 호출하면 비동기 적으로 다운로드 작업을 수행 한 후 반환 값을 즉시 확인합니다. 즉 "null"입니다. 그렇다면 return 값을 dataTask와 동기화하거나 완료를 다른 방식으로 확인하려면 어떻게해야합니까?

이미 "멍청한"while 루프와 세마포어 접근 방식을 사용하여 예상대로 주 스레드를 걸었습니다. 알림으로 시도했지만 아무 것도 안 남았습니다.

나는 그게 단순한 해결책을 가지고 있다고 확신하지만 그것을 얻을 수는 없다.

도움이 될 것입니다.

+0

URL이 실제 데이터로 유효한 json 인코딩 응답을 실제로 반환하고 있는지 확인하여 시작할 것입니다. 아마도 URL이 로그 파일에 반환 할 데이터를 쓰도록해야합니다. – DontKnow

+0

아니요, URL은 괜찮습니다. 이전에 NSURLSession을 사용하고 while 회 돌이로 응답을 기다렸습니다. 문제는 NSURLSession에서 API를 사용하는 데 문제가있어서 AFnetworking으로 이동해야했습니다. 어쨌든, 완성 블록을 사용하는 것이 유일한 정답입니다. – briznichenko

답변

0

예, 몇 가지 기본 사항이 누락되었습니다.

비동기 적으로 작동하는 메서드를 호출하고 즉시 응답을 기대할 수 없습니다. 솔루션은 완료 블록을 수행하는 메소드를 작성하는 것입니다. 그런 다음 완료 블록에서 실행하려는 코드를 전달합니다. 결과를 사용할 수 있기 전에 메서드 호출이 즉시 반환되지만 다운로드 작업이 완료되면 완성 블록 코드가 호출됩니다.

샘플 앱을 포함하는 SO 답변을 작성했지만 Swift로 작성되었습니다. 당신이 iOS 개발에 아주 새롭고 Objective-C에서 일하고 있다면 당신은 따라하기 힘들 것입니다.

iOS 개발을 배우는 경우 Swift를 배우는 것에 대해 진지하게 생각해야합니다. Apple은 iOS 개발의 미래가 Swift라는 것을 분명히합니다. Learning Objective-C는 유용하지만, Swift에 중점을 두는 것이 좋습니다.

+0

감사합니다. 오늘 제 멘토에게 같은 질문을 물었습니다. 대답은 똑같습니다. 그래서 완성 블록을 배우는 것이 나의 다음 단계입니다. 그래서 나는 심각한 리팩토링을해야 할 것입니다. 다시 한번 감사드립니다! – briznichenko

관련 문제