2010-02-21 8 views
5

मैं अपने आईफोन ऐप में किसी सर्वर से कुछ डेटा का अनुरोध करने के लिए ASIHTTPRequest लाइब्रेरी का उपयोग कर रहा हूं। लेकिन मैं यह नहीं समझ सकता कि टाइमआउट कैसे बनाएं ताकि अगर सर्वर डाउन हो या आईफोन में इंटरनेट कनेक्शन नहीं है तो ऐप क्रैश नहीं होता है।टाइमआउट एक ASIHTTP अनुरोध

अग्रिम धन्यवाद

संपादित करें >>>

tt.Kilew अपने कोड काम नहीं करता है ... मैं नमूना कोड का एक सा तैनात

NSURL *url = [NSURL URLWithString:@"A URL WITH A FORM"]; 
ASIFormDataRequest *requestPOST = [ASIFormDataRequest requestWithURL:url]; 
[requestPOST setPostValue:un forKey:@"username"]; 
[requestPOST setPostValue:pw forKey:@"password"];   
[requestPOST setPostValue:@"Login" forKey:@"submit"]; 
[requestPOST start]; 

[requestPOST setTimeOutSeconds:10]; 

NSLog(@"Fail: %@", [requestPOST failWithError:ASIRequestTimedOutError]); 

उत्तर

16
[request setTimeOutSeconds:10]; 

अधिक के साथ अद्यतन कोड:

NSURL *url = [NSURL URLWithString:@"A URL WITH A FORM"]; 
ASIFormDataRequest *requestPOST = [ASIFormDataRequest requestWithURL:url]; 
[requestPOST setPostValue:un forKey:@"username"]; 
[requestPOST setPostValue:pw forKey:@"password"];   
[requestPOST setPostValue:@"Login" forKey:@"submit"]; 
[requestPOST setTimeOutSeconds:10]; 
[requestPOST setDelegate:self] 
[requestPOST startAsynchronous]; 

विफल हैंडलर:

- (void)requestFailed:(ASIHTTPRequest *)request { 
    NSError *error = [request error]; 
    if ([error isKindOfClass:[ASIRequestTimedOutError class]]) { 
     // Actions specific to timeout 
    } 
} 

सफलता हैंडलर:

- (void)requestFinished:(ASIHTTPRequest *)request 
{ 
    // Use when fetching text data 
    NSString *responseString = [request responseString]; 

    // Use when fetching binary data 
    NSData *responseData = [request responseData]; 

    // Do something with the response. 
} 
+0

क्या यह कुछ वापस करता है? (समय समाप्ति == सच) { // कुछ त्रुटि संदेश } else –

+1

कि सिर्फ आपके अनुरोध है कि यह 10 सेकंड के बाद का समय-समाप्त करना चाहिए बताता है { // अगले कदम के लिए आगे बढ़ें } अगर क्योंकि मैं की तरह एक बयान की आवश्यकता है। यदि अनुरोध का समय समाप्त हो गया है, तो यह आपके अनुरोध को कॉल करेगा विफल: प्रतिनिधि जो आप ASIRequestTimedOutError के लिए जांच सकते हैं (जैसा कि नीचे tt.Kilew द्वारा समझाया गया है)। – chrissr

+0

क्या आप कुछ नमूना कोड पोस्ट कर सकते हैं, मैं इसे –

0
// Number of seconds to wait before timing out - default is 10 
NSTimeInterval timeOutSeconds; 

तो समय समाप्त हो जाएगा, तो आप प्राप्त करेंगे

[self failWithError:ASIRequestTimedOutError]; 
+0

यह काम नहीं करता है नमूना कोड मैंने –

8

मैं सामान्य रूप से इस तरह की जाँच करें:

- (void)requestFailed:(ASIHTTPRequest *)request 
{  
    NSString *message = NULL; 

    NSError *error = [request error]; 
    switch ([error code]) 
    { 
     case ASIRequestTimedOutErrorType: 
      message = kAlertMsgTimeoutError; 
      break; 
     case ASIConnectionFailureErrorType: 
      message = kAlertMsgConnectionFailError; 
      break; 
     case ASIAuthenticationErrorType: 
      message = kAlertMsgAuthFailError; 
      break; 
     case ASITooMuchRedirectionErrorType: 
      message = kAlertMsgTooManyRedirect; 
      break; 
     case ASIRequestCancelledErrorType: 
      message = kAlertMsgReqCancelledError; 
      break; 
     case ASIUnableToCreateRequestErrorType: 
      message = kAlertMsgUnableCreateReqError; 
      break; 
     case ASIInternalErrorWhileBuildingRequestType: 
      message = kAlertMsgUnableBuildReqError; 
      break; 
     case ASIInternalErrorWhileApplyingCredentialsType: 
      message = kAlertMsgUnableApplyCredError; 
      break; 
     case ASIFileManagementError: 
      message = kAlertMsgFileManageError; 
      break; 
     case ASIUnhandledExceptionError: 
      message = kAlertMsgUnhandledExcepError; 
      break; 
     case ASICompressionError: 
      message = kAlertMsgCompressionError; 
      break; 
     default: 
      message = kAlertMsgGenericError; 
      break; 
    } 

    if (NULL != message) 
    { 
     UIAlertView *alert = [[UIAlertView alloc] initWithTitle:kApplicationTitle 
                 message:message 
                 delegate:self 
               cancelButtonTitle:kAlertDefaultCancel 
               otherButtonTitles:nil]; 
     [alert show]; 
    } 
} 
+0

पोस्ट किया है, इस विधि के लिए जोड़ना चाहते हैं ????? –

+0

इसके लिए धन्यवाद, यह बहुत अच्छा काम करता है। – AndyGable