Чтение онлайн

ЖАНРЫ

iOS. Приемы программирования

Нахавандипур Вандад

Шрифт:

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);

}

}];

Да,

все так просто. Если вы хотите сохранить данные, которые мы загрузили на диск в ходе соединения, это можно сделать с помощью подходящих методов класса NSData, получаемых от завершающего блока:

NSString *urlAsString = @"http://www.apple.com";

NSURL *url = [NSURL URLWithString: urlAsString];

NSURLRequest *urlRequest = [NSURLRequest requestWithURL: url];

NSOperationQueue *queue = [[NSOperationQueue alloc] init];

[NSURLConnection

sendAsynchronousRequest: urlRequest

queue: queue

completionHandler: ^(NSURLResponse *response,

NSData *data,

NSError *error) {

if ([data length] >0 &&

error == nil){

/* Прикрепляем имя файла к каталогу с документами. */

NSURL *filePath =

[[self documentsFolderUrl]

URLByAppendingPathComponent:@"apple.html"];

[data writeToURL: filePath atomically: YES];

NSLog(@"Successfully saved the file to %@", filePath);

}

else if ([data length] == 0 &&

error == nil){

NSLog(@"Nothing was downloaded.");

}

else if (error!= nil){

NSLog(@"Error happened = %@", error);

}

}];

Все действительно просто. В более ранних версиях iOS SDK соединения по URL происходили с применением делегирования, но теперь модель стала обычной блоковой и вам не придется заниматься реализацией делегатов.

11.2. Обработка задержек при асинхронных соединениях

Необходимо задать лимит ожидания — проще говоря, задержку — при асинхронном соединении.

Решение

Задайте задержку в URL-запросе, посылаемом классу NSURLConnection.

Обсуждение

При инстанцировании объекта типа 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) в соответствующем параметре завершающего блока.

11.3. Синхронная загрузка с применением NSURLConnection

Постановка задачи

Необходимо синхронно загрузить информацию, расположенную по имеющемуся URL.

Решение

Используйте метод класса sendSynchronousRequest: returningResponse: error:, относящийся к классу NSURLConnection. Возвращаемое значение этого метода — данные типа NSData.

Поделиться с друзьями: