NSMutableURLRequest *request = [NSMutableURLRequestrequestWithURL:self.address cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData
timeoutInterval:self.defaultTimeout];
timeoutInterval 已經沒有了作用。
這個問題只有在3.0以及之後的os中才有的,而且只有在當調用了setHTTPBody之後才會出現timeout失效。這個是蘋果公司對URLLoadingSystem的在OS3.0中的一個改動,不過在我看來其實這就是一個bug!在setHTTPBody之後,request的timeout會被改為240s(這個你可以通過NSLog [requesttimeoutInterval]查看),蘋果開發人員的解釋就是通常我們自己設置的太短的timeout其實是沒什麼作用的,尤其對移動設備上來講與網絡溝通需要的時間往往是比較長的,假如你的timeout是10s,在WWAN的網絡環境下,可能才剛剛“bring WWANInterface up”(不知道怎麼翻譯,囧)。所以自從OS 3後,如果設置了HTTPbody的data,系統就會自動設置一個最低的timeout值,即240s,而且這個值都是不能被改動的,即是你自己再次設置了timeoutInterval,你通過NSLog [request timeoutInterval]得到的還是240S!!
我想的解決辦法只有自定義一個操作。辦法比較笨,但是真的好使
NSMutableURLRequest *request = [NSMutableURLRequestrequestWithURL:self.address
cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData
timeoutInterval:self.defaultTimeout];
NSData*bodyData = [outputBodydataUsingEncoding:NSUTF8StringEncoding];
if(cookies!= nil) {
[requestsetAllHTTPHeaderFields:[NSHTTPCookierequestHeaderFieldsWithCookies:cookies]];
}
[requestsetValue:@"wsdl2objc" forHTTPHeaderField:@"User-Agent"];
[requestsetValue:soapAction forHTTPHeaderField:@"SOAPAction"];
[requestsetValue:@"text/xml; charset=utf-8"forHTTPHeaderField:@"Content-Type"];
[requestsetValue:[NSString stringWithFormat:@"%u", [bodyData length]]forHTTPHeaderField:@"Content-Length"];
[requestsetValue:self.address.host forHTTPHeaderField:@"Host"];
[requestsetHTTPMethod: @"POST"];
[requestsetHTTPBody: bodyData];
NSURLConnection *connection = [[NSURLConnection alloc]initWithRequest:request delegate:operation];
//自定義時間超時
[NSTimerscheduledTimerWithTimeInterval:self.defaultTimeout target: selfselector: @selector(handleTimer) userInfo:operationrepeats:NO];
operation.urlConnection = connection;
[connectionrelease];
}
//時間超時定義
-(void) handleTimer
{
[operationCopy connection:[NSError errorWithDomain:@"時間超時!"code:256 userInfo:nil]];
}