Книга: iOS. Приемы программирования
Обсуждение
Обсуждение
При инстанцировании объекта типа NSURLRequest для передачи URL-соединения можно воспользоваться методом класса requestWithURL: cachePolicy: timeoutInterval:, относящимся к этому объекту, и передать желаемую длительность задержки в секундах в параметре timeoutInterval.
Например, если вы готовы не более 30 секунд дожидаться, пока загрузится содержимое главной страницы Apple (с применением синхронного соединения), создайте ваш URL таким образом:
— (BOOL) application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
NSString *urlAsString = @"http://www.apple.com";
NSURL *url = [NSURL URLWithString: urlAsString];
NSURLRequest *urlRequest =
[NSURLRequest
requestWithURL: url
cachePolicy: NSURLRequestReloadIgnoringLocalAndRemoteCacheData
timeoutInterval:30.0f];
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[NSURLConnection
sendAsynchronousRequest: urlRequest
queue: queue
completionHandler: ^(NSURLResponse *response,
NSData *data,
NSError *error) {
if ([data length] >0 &&
error == nil){
NSString *html = [[NSString alloc] initWithData: data
encoding: NSUTF8StringEncoding];
NSLog(@"HTML = %@", html);
}
else if ([data length] == 0 &&
error == nil){
NSLog(@"Nothing was downloaded.");
}
else if (error!= nil){
NSLog(@"Error happened = %@", error);
}
}];
self.window = [[UIWindow alloc]
initWithFrame: [[UIScreen mainScreen] bounds]];
self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible];
return YES;
}
Что же здесь происходит? Дело в том, что среда времени исполнения пытается получить содержимое, расположенное по предоставленной ссылке. Если это удается сделать в течение заданных 30 секунд и соединение устанавливается до возникновения задержки — хорошо. В противном случае среда времени исполнения выдаст вам ошибку задержки (error) в соответствующем параметре завершающего блока.