オブジェクトを使用して、このメソッドNSURLRequest
を使用してダウンロードしたevreyリクエストのタイムアウトを指定します。requestWithURL:cachePolicy:timeoutInterval:
NSURLConnection
のデリゲートが設定され、connection:didFailWithError:
メソッドに応答するかどうかを確認してください。ANSURLConnection
は、このメソッドを呼び出すかconnectionDidFinishLoading:
、接続の完了時に呼び出します。
'didFailWithError'メソッドを処理し、NSError
オブジェクトを使用して失敗の理由を確認します。
ただし、サーバーから応答があり、応答時間が遅い場合は、を使用しNSTimer
ます。データをダウンロードするためのヘルパークラスを作成して、複数のインスタンスを作成し、NSTimerを設定して、クラスを複数のダウンロードに再利用できるようにします。ダウンロードが30秒以内に終了した場合は、タイマーを無効にします。それ以外の場合は、ダウンロードをキャンセルします[self.connection cancel]
。
次のコードを確認してください。
- (void)_startReceive
// Starts a connection to download the current URL.
{
BOOL success;
NSURL * url;
NSURLRequest * request;
// Open a connection for the URL.
request = [NSURLRequest requestWithURL:url];
assert(request != nil);
self.connection = [NSURLConnection connectionWithRequest:request delegate:self];
assert(self.connection != nil);
// If we've been told to use an early timeout for get complete response within 30 sec,
// set that up now.
self.earlyTimeoutTimer = [NSTimer scheduledTimerWithTimeInterval:30.0 target:self selector:@selector(_earlyTimeout:) userInfo:nil repeats:NO];
}
}
- (void)_stopReceiveWithStatus:(NSString *)statusString
// Shuts down the connection and displays the result (statusString == nil)
// or the error status (otherwise).
{
if (self.earlyTimeoutTimer != nil) {
[self.earlyTimeoutTimer invalidate];
self.earlyTimeoutTimer = nil;
}
if (self.connection != nil) {
[self.connection cancel];
self.connection = nil;
}
}
- (void)_earlyTimeout:(NSTimer *)timer
// Called by a timer (if the download is not finish)
{
[self _stopReceiveWithStatus:@"Early Timeout"];
}
- (void)connection:(NSURLConnection *)conn didReceiveResponse:(NSURLResponse *)response
// A delegate method called by the NSURLConnection when the request/response
// exchange is complete.
{ }
- (void)connection:(NSURLConnection *)conn didReceiveData:(NSData *)data
// A delegate method called by the NSURLConnection as data arrives. We just
// write the data to the file.
{ }
- (void)connection:(NSURLConnection *)conn didFailWithError:(NSError *)error
// A delegate method called by the NSURLConnection if the connection fails.
{
NSLog(@"didFailWithError %@", error);
// stop Receive With Status Connection failed
}
- (void)connectionDidFinishLoading:(NSURLConnection *)conn
// A delegate method called by the NSURLConnection when the connection has been
// done successfully. We shut down the connection with a nil status.
{
NSLog(@"connectionDidFinishLoading");
// If control reach here before timer invalidate then save the data and invalidate the timer
if (self.earlyTimeoutTimer != nil) {
[self.earlyTimeoutTimer invalidate];
self.earlyTimeoutTimer = nil;
}
}