— (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.");
}
});
});
}