Читаем iOS. Приемы программирования полностью

— (void) viewDidAppear:(BOOL)animated{

[super viewDidAppear: animated];

dispatch_queue_t concurrentQueue =

dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);


dispatch_async(concurrentQueue, ^{


__block UIImage *image = nil;


dispatch_sync(concurrentQueue, ^{

/* Здесь скачивается изображение. */

});


dispatch_sync(dispatch_get_main_queue, ^{

/* Здесь мы демонстрируем изображение пользователю и делаем это

в главной очереди. */

});


});

}


Второй вызов к dispatch_sync, после которого отобразится картинка, будет выполняться в очереди после первого синхронного вызова, который обеспечивает загрузку изображения. Именно этого мы и добивались, поскольку нам необходимо дождаться, пока изображение загрузится полностью, и только после этого мы сможем отобразить его для пользователя. Итак, после завершения скачивания изображения мы выполняем второй блоковый объект, но на этот раз — в главной очереди.

Скачаем изображение и отобразим его для пользователя. Это мы сделаем в методе экземпляра viewDidAppear:, относящемся к контроллеру вида, который в данный момент отображается в приложении для iPhone:


— (void) viewDidAppear:(BOOL)paramAnimated{

[super viewDidAppear: paramAnimated];


dispatch_queue_t concurrentQueue =

dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);


dispatch_async(concurrentQueue, ^{


__block UIImage *image = nil;


dispatch_sync(concurrentQueue, ^{

/* Здесь скачивается изображение. */


/* Изображение iPad с сайта Apple. Гиперссылка слишком длинная,

поэтому ее нужно правильно разбить на две строки. */

NSString *urlAsString = @"http://images.apple.com/mobileme/features"\

«/images/ipad_findyouripad_201 00518.jpg»;


NSURL *url = [NSURL URLWithString: urlAsString];


NSURLRequest *urlRequest = [NSURLRequest requestWithURL: url];


NSError *downloadError = nil;

NSData *imageData = [NSURLConnection

sendSynchronousRequest: urlRequest

returningResponse: nil

error:&downloadError];


if (downloadError == nil &&

imageData!= nil){


image = [UIImage imageWithData: imageData];

/* Изображение у нас есть. Теперь можно его использовать. */


}

else if (downloadError!= nil){

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

} else {

NSLog(@"No data could get downloaded from the URL.");

}


});


dispatch_sync(dispatch_get_main_queue, ^{

/* Здесь картинка отображается, и это происходит в главной очереди. */


if (image!= nil){

/* Здесь создается вид с изображением. */

UIImageView *imageView = [[UIImageView alloc]

initWithFrame: self.view.bounds];


/* Задаем характеристики изображения. */

[imageView setImage: image];


/* Убеждаемся, что изображение масштабировано правильно. */

[imageView setContentMode: UIViewContentModeScaleAspectFit];


/* Добавляем изображение к виду данного контроллера вида. */

[self.view addSubview: imageView];


} else {

NSLog(@"Image isn't downloaded. Nothing to display.");

}


});


});


}


Перейти на страницу:
Нет соединения с сервером, попробуйте зайти чуть позже