2013-01-14 61 views
2

我試圖在連接失敗時測試我的應用程序的行爲。我正在iPad上關閉WiFi測試。當Restkit試圖調用Web服務,我得到以下錯誤: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. 

的問題是,我想在處理委託的回調方法這種情況,但沒有委託方法被調用。我已經在請求上設置了委託,並且實現了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.m行,我張貼以上只是調用RKRequest另一種方法,但事實並非如此。在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.

這是很奇怪的。我會盡量全面清理項目並重建。

至於什麼需要直接調用,而不是使用performSelector,你可以看到afterDelay

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

這將使didFailLoadWithError:方法在運行循環的下一次迭代被調用。我會保持這種稱呼它的方式。

你可以嘗試,不過,這個替代:

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