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

на главную - закладки

Жанры

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

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

Шрифт:

});

}

Второй вызов к 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.");

}

});

});

}

Как показано на рис. 7.2, мы успешно загрузили изображение, а также создали вид изображения, в котором картинка будет представлена пользователю в графическом интерфейсе.

Рис. 7.2. Загрузка изображения и демонстрация его пользователю, применяется GCD

Приведем другой пример. Допустим, у нас есть массив из 10 000 случайных чисел, которые сохранены в файле на диске. Мы хотим загрузить этот файл в память и отсортировать числа в порядке возрастания (то есть сделать так, чтобы список начинался с наименьшего числа). Потом мы хотим отобразить полученный список для пользователя. Инструмент управления, который будет применяться при этой операции, определяется тем, для какой системы вы пишете программу. В случае с iOS идеальным выходом было бы использовать экземпляр UITableView, а при работе с Mac OS X — экземпляр NSTableView. Поскольку массива у нас еще нет, начнем с его создания, потом загрузим этот массив, а потом отобразим.

Вот два метода, которые помогут нам найти место на диске устройства, где мы собираемся сохранить массив из 10 000 случайных чисел:

— (NSString *) fileLocation{

/* Получаем каталог (-и) документа. */

NSArray *folders =

NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,

NSUserDomainMask,

YES);

/* Мы что-нибудь нашли? */

if ([folders count] == 0){

return nil;

}

/* Получаем первый каталог. */

NSString *documentsFolder = [folders objectAtIndex:0];

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

return [documentsFolder

stringByAppendingPathComponent:@"list.txt"];

}

— (BOOL) hasFileAlreadyBeenCreated{

Поделиться:
Популярные книги

Лекарь

Назимов Константин Геннадьевич
2. Травник
Фантастика:
фэнтези
5.25
рейтинг книги
Лекарь

Наша навсегда

Зайцева Мария
2. Наша
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Наша навсегда

Газлайтер. Том 27

Володин Григорий Григорьевич
27. История Телепата
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Газлайтер. Том 27

Искатель 1

Шиленко Сергей
1. Валинор
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Искатель 1

Я снова царь. Книга XXXIII

Дрейк Сириус
33. Дорогой барон!
Фантастика:
юмористическое фэнтези
аниме
попаданцы
5.00
рейтинг книги
Я снова царь. Книга XXXIII

Представитель

Семин Никита
6. Переломный век
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Представитель

Андер Арес

Грехов Тимофей
1. Андер Арес
Фантастика:
рпг
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Андер Арес

Первый среди равных. Книга V

Бор Жорж
5. Первый среди Равных
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Первый среди равных. Книга V

Кодекс Охотника. Книга VIII

Винокуров Юрий
8. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга VIII

Принц Ардена

Анри Софи
Любовные романы:
исторические любовные романы
5.00
рейтинг книги
Принц Ардена

На границе империй. Том 9. Часть 4

INDIGO
17. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 9. Часть 4

Бастард Императора. Том 11

Орлов Андрей Юрьевич
11. Бастард Императора
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Бастард Императора. Том 11

Иной. Том 5. Адская работа

Amazerak
5. Иной в голове
Фантастика:
боевая фантастика
городское фэнтези
технофэнтези
рпг
5.00
рейтинг книги
Иной. Том 5. Адская работа

Сильнейший Столп Империи. Книга 1

Ермоленков Алексей
1. Сильнейший Столп Империи
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Сильнейший Столп Империи. Книга 1