2013-01-14 2 views
2

연결에 실패 할 때 내 응용 프로그램의 동작을 테스트하려고합니다. Wi-Fi가 꺼진 iPad를 테스트 중입니다.RestKit 연결 실패 대리인

CPL[7713:6203] E restkit.network:RKRequest.m:545 Failed to send request to https://xxxxxxxx/APNS_WebService/rest/operations/initializeDevice?deviceID=c4a17f855d3cc824b174b71908480d4e505ebfb221cb4643da9270a07344c367 due to unreachable network. 

문제는 내가 대리인 콜백 메소드에서이 상황을 처리하고 싶다고하지만, 위임 방법 중 어느 것도 호출되지되고있다 : Restkit 웹 서비스 호출을 시도 할 때, 나는 다음과 같은 오류가 발생합니다. 요청에 대한 위임자를 설정하고 requestDidFailLoadWithError, requestDidCancelLoad, requestDidTimeout 및 objectLoaderDidFailWithError를 구현했습니다. 이 중 아무 것도 호출되지 않습니다.

왜 내 대리인이 호출되지 않습니까?

편집 : RKRequest.m 내부에 중단 점을 설정 한 후, 나는 다음 줄이 실행되는 사실에 있음을 참조하십시오

 [self performSelector:@selector(didFailLoadWithError:) withObject:error afterDelay:0]; 

그러나, 내 대리자 메서드가 호출되지 않아요.

는 여기에 내가 위임 설정 어디 :

request = [client requestWithResourcePath:[NSString stringWithFormat:@"/initializeDevice?deviceID=%@",deviceID]]; 
request.delegate=self; 
[request sendAsynchronously]; 

편집 2 : 사실, 위의 게시 그렇지 않은 것을 제외하고 그냥 RKRequest에서 다른 방법을 호출 RKRequest.m의 라인. didFailLoadWithError에 중단 점을 넣으면이 코드에 도달하지 못했습니다. 그게 효과가없는 이유를 모르겠습니다.

performSelector를 일반적인 메서드 호출로 변경하면 표면에 내가 원하는 동작을 제공합니다. 이 일이 무너질 건가요? performSelector가 같은 클래스의 메서드를 호출하는 데 왜 사용되는지 잘 모르겠다.

편집 3 : 요청으로, 여기 내 대리자 메서드입니다 :

-(void)request:(RKRequest *)request didFailLoadWithError:(NSError *)error{ 
    NSLog(error.domain); 
    NSLog([NSString stringWithFormat:@"%d",error.code]); 
    NSLog(error.localizedDescription); 
    NSLog(error.localizedFailureReason); 

    [request reset]; 
    [request send]; 
} 

답변

1

편집 :

Actually, the line in RKRequest.m that I posted above is just calling another method in RKRequest, except that it's not. Putting a breakpoint in didFailLoadWithError shows that this code is never reached. I don't get why that's not working.

이 정말 이상하다. 나는 프로젝트를 완전히 깨끗하게하고 재건하려고 노력할 것이다.

[self performSelector:@selector(didFailLoadWithError:) withObject:error afterDelay:0]; 

이이 didFailLoadWithError: 메소드가 실행 루프의 다음 반복 호출 할 것 :

대신 performSelector을 사용하는 직접 전화를 수반 무엇을, 당신은 afterDelay 것을 볼 수 있습니다. 나는 그것을 부르는 이런 방식을 유지할 것이다.

당신이 대안하지만, 시도해 볼 수도 있습니다 :

dispatch_async(dispatch_get_current_queue(), ^() { 
         [self didFailLoadWithError:error]; }); 

은 당신이 사용하고있는 RestKit 방법의 내부에 중단 점을 설정 제안 (나는 sendAsynchronously를 가정) 무슨 일이 일어나는지 확인한다. 메서드 정의를 살펴보면 대리자에 대한 호출이 효과적으로 발생합니다.

} else { 
     self.loading = YES; 

     RKLogError(@"Failed to send request to %@ due to unreachable network. Reachability observer = %@", [[self URL] absoluteString], self.reachabilityObserver); 
     NSString* errorMessage = [NSString stringWithFormat:@"The client is unable to contact the resource at %@", [[self URL] absoluteString]]; 
     NSDictionary *userInfo = [NSDictionary dictionaryWithObjectsAndKeys: 
            errorMessage, NSLocalizedDescriptionKey, 
            nil]; 
     NSError* error = [NSError errorWithDomain:RKErrorDomain code:RKRequestBaseURLOfflineError userInfo:userInfo]; 
     [self performSelector:@selector(didFailLoadWithError:) withObject:error afterDelay:0]; 
    } 
+0

감사합니다. –

+0

제 편집을 참조하십시오. –

+0

위임자 메소드가 호출되지 않은 이유를 정확히 알기 위해 왜 didFailLoadWithError :'를 실행하지 않습니까?당신이 선택한 캐시 정책에 따라 달라질 수 있습니다 ... – sergio