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

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

Жанры

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

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

Шрифт:

Обсуждение

GCD позволяет создавать группы. Пользуясь группами, можно поместить несколько задач в одном месте, выполнить их все, а по завершении работы получить об этом уведомление от GCD. Такая технология имеет большое прикладное значение. Допустим, например, что у вас есть приложение с пользовательским интерфейсом и вы хотите перезагрузить его компоненты в этом пользовательском интерфейсе. В пользовательском интерфейсе у вас имеется табличный вид, прокручиваемый вид и вид с изображением. Вы хотите перезагрузить содержимое этих компонентов с помощью следующих методов:

— (void) reloadTableView{

/* Здесь перезагружается табличный вид. */

NSLog(@"%s", __FUNCTION__);

}

— (void) reloadScrollView{

/* Здесь выполняется работа. */

NSLog(@"%s", __FUNCTION__);

}

— (void) reloadImageView{

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

NSLog(@"%s", __FUNCTION__);

}

На данный момент эти методы пусты, но вы можете позже поместить в них важный код, связанный с пользовательским интерфейсом. Сейчас мы собираемся вызвать эти три метода один за другим и узнать, когда GCD закончит вызывать эти методы, в результате чего мы отобразим соответствующее сообщение для пользователя. Для этого нам придется воспользоваться группой. При работе с группами в GCD необходимо иметь представление о трех функциях:

• dispatch_group_create — создает описатель группы;

• dispatch_group_async — отправляет блок кода в группу для выполнения. Необходимо указать диспетчерскую очередь, в которой должен выполняться этот блок кода, а также группу, к которой этот блок кода относится;

• dispatch_group_notify — позволяет отправить блоковый объект, который необходимо выполнить после того, как все задачи, направленные в группу для выполнения, закончат свою работу. Эта функция также позволяет указывать диспетчерскую очередь, в которой должен выполняться данный блоковый объект.

Рассмотрим пример. Как объяснялось ранее, в этом примере мы собираемся активизировать методы reloadTableView, reloadScrollView и reloadImageView один за другим, а потом отобразить для пользователя сообщение о том, что задача выполнена. Для достижения этой цели применим мощные групповые функции, присущие GCD:

— (BOOL) application:(UIApplication *)application

didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{

dispatch_group_t taskGroup = dispatch_group_create;

dispatch_queue_t mainQueue = dispatch_get_main_queue;

/* Перезагружаем табличный вид в главной очереди. */

dispatch_group_async(taskGroup, mainQueue, ^{

[self reloadTableView];

});

/* Перезагружаем прокручиваемый вид в главной очереди. */

dispatch_group_async(taskGroup, mainQueue, ^{

[self reloadScrollView];

});

/* Перезагружаем вид с изображением в главной очереди. */

dispatch_group_async(taskGroup, mainQueue, ^{

[self reloadImageView];

});

/* Когда все это будет сделано, диспетчеризуем следующий блок. */

dispatch_group_notify(taskGroup, mainQueue, ^{

/* Здесь происходит обработка. */

[[[UIAlertView alloc] initWithTitle:@"Finished"

message:@"All tasks are finished"

delegate: nil

cancelButtonTitle:@"OK"

otherButtonTitles: nil, nil] show];

});

self.window = [[UIWindow alloc] initWithFrame:

[[UIScreen mainScreen] bounds]];

self.window.backgroundColor = [UIColor whiteColor];

[self.window makeKeyAndVisible];

return YES;

}

Кроме работы с функцией dispatch_group_async, можно также направлять асинхронные функции на языке C, используя функцию dispatch_group_async_f.

GCDAppDelegate — это просто имя класса, из которого взят пример. Данное имя класса мы будем использовать для приведения типа контекстного объекта так, чтобы компилятор понимал наши команды.

Вот так:

void reloadAllComponents(void *context){

AppDelegate *self = (__bridge AppDelegate *)context;

[self reloadTableView];

[self reloadScrollView];

[self reloadImageView];

}

— (BOOL) application:(UIApplication *)application

didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{

dispatch_group_t taskGroup = dispatch_group_create;

dispatch_queue_t mainQueue = dispatch_get_main_queue;

dispatch_group_async_f(taskGroup,

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

Ваше Сиятельство 6

Моури Эрли
6. Ваше Сиятельство
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Ваше Сиятельство 6

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

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

Жизнь коротка

Желязны Роджер Джозеф
Классика мировой фантастики
Фантастика:
социально-философская фантастика
научная фантастика
боевая фантастика
космическая фантастика
7.33
рейтинг книги
Жизнь коротка

Отряд

Валериев Игорь
5. Ермак
Фантастика:
альтернативная история
5.25
рейтинг книги
Отряд

Я еще граф. Книга #8

Дрейк Сириус
8. Дорогой барон!
Фантастика:
боевая фантастика
попаданцы
5.00
рейтинг книги
Я еще граф. Книга #8

Печать Пожирателя

Соломенный Илья
1. Пожиратель
Фантастика:
попаданцы
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Печать Пожирателя

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

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

Уникум

Поселягин Владимир Геннадьевич
1. Уникум
Фантастика:
альтернативная история
4.60
рейтинг книги
Уникум

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

INDIGO
8. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
6.13
рейтинг книги
На границе империй. Том 7. Часть 2

Рассвет русского царства. Книга 2

Грехов Тимофей
2. Новая Русь
Фантастика:
альтернативная история
попаданцы
историческое фэнтези
5.00
рейтинг книги
Рассвет русского царства. Книга 2

Рядовой. Назад в СССР. Книга 1

Гаусс Максим
1. Второй шанс
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Рядовой. Назад в СССР. Книга 1

Убивать чтобы жить 3

Бор Жорж
3. УЧЖ
Фантастика:
героическая фантастика
боевая фантастика
рпг
5.00
рейтинг книги
Убивать чтобы жить 3

Хозяин Стужи 4

Петров Максим Николаевич
4. Злой Лед
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Хозяин Стужи 4

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

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