Kniga-Online.club
» » » » Вандад Нахавандипур - iOS. Приемы программирования

Вандад Нахавандипур - iOS. Приемы программирования

Читать бесплатно Вандад Нахавандипур - iOS. Приемы программирования. Жанр: Программирование издательство -, год 2004. Так же читаем полные версии (весь текст) онлайн без регистрации и SMS на сайте kniga-online.club или прочесть краткое содержание, предисловие (аннотацию), описание и ознакомиться с отзывами (комментариями) о произведении.
Перейти на страницу:

Раздел 7.4.

7.10. Создание собственных диспетчерских очередей с помощью GCD

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

Требуется создавать собственные диспетчерские очереди с уникальными именами.

Решение

Воспользуйтесь функцией dispatch_queue_create.

Обсуждение

Работая с GCD, вы можете создавать собственные последовательные диспетчерские очереди (см. раздел 7.0, где подробно рассказано о последовательных очередях). Задачи в последовательных диспетчерских очередях выполняются по принципу «первым пришел — первым обслужен» (FIFO). Но асинхронные задачи, выполняемые в последовательных очередях, не осуществляются в главном потоке, благодаря чему последовательные очереди очень хорошо подходят для решения параллельных FIFO-задач.

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

Для создания последовательных очередей мы будем пользоваться функцией dispatch_queue_create. Первый параметр этой функции — строка на языке C (char *), которая уникально идентифицирует данную последовательную очередь в системе. Я делаю особый акцент на системе, потому что данный идентификатор действует в рамках всей системы. Это означает, что если ваше приложение создает новую последовательную очередь с идентификатором serialQueue1 и то же самое делает какое-то другое приложение, GCD не сможет зафиксировать акт создания такой одноименной последовательной очереди. Поэтому Apple настоятельно рекомендует, чтобы идентификаторы записывались в формате «обратное доменное имя» (Reverse DNS Format). Идентификаторы в формате обратных доменных имен обычно составляются по следующему принципу: com.COMPANY.PRODUCT.IDENTIFIER. Например, я могу создать две последовательные очереди и присвоить им следующие имена:

com.pixolity.GCD.serialQueue1

com.pixolity.GCD.serialQueue2

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

Пожалуй, самое время для примера. Вот он!

— (BOOL) application:(UIApplication *)application

didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{

dispatch_queue_t firstSerialQueue =

dispatch_queue_create(«com.pixolity.GCD.serialQueue1», 0);

dispatch_async(firstSerialQueue, ^{

NSUInteger counter = 0;

for (counter = 0;

counter < 5;

counter++){

NSLog(@"First iteration, counter = %lu", (unsigned long)counter);

}

});

dispatch_async(firstSerialQueue, ^{

NSUInteger counter = 0;

for (counter = 0;

counter < 5;

counter++){

NSLog(@"Second iteration, counter = %lu", (unsigned long)counter);

}

});

dispatch_async(firstSerialQueue, ^{

NSUInteger counter = 0;

for (counter = 0;

counter < 5;

counter++){

NSLog(@"Third iteration, counter = %lu", (unsigned long)counter);

}

});

self.window = [[UIWindow alloc] initWithFrame:

[[UIScreen mainScreen] bounds]];

self.window.backgroundColor = [UIColor whiteColor];

[self.window makeKeyAndVisible];

return YES;

}

Запустив этот код, обратите внимание на то, какая информация выводится в окне консоли. Результаты будут примерно такими:

First iteration, counter = 0

First iteration, counter = 1

First iteration, counter = 2

First iteration, counter = 3

First iteration, counter = 4

Second iteration, counter = 0

Second iteration, counter = 1

Second iteration, counter = 2

Second iteration, counter = 3

Second iteration, counter = 4

Third iteration, counter = 0

Third iteration, counter = 1

Third iteration, counter = 2

Third iteration, counter = 3

Third iteration, counter = 4

Очевидно, что, хотя мы и направляли блоковые объекты в последовательную очередь асинхронно, очередь выполняла их код в порядке «первым пришел — первым обслужен». Мы можем изменить этот пример с кодом так, чтобы пользоваться функцией dispatch_async_f вместо dispatch_async:

void firstIteration(void *paramContext){

NSUInteger counter = 0;

for (counter = 0;

counter < 5;

counter++){

NSLog(@"First iteration, counter = %lu", (unsigned long)counter);

}

}

void secondIteration(void *paramContext){

NSUInteger counter = 0;

for (counter = 0;

counter < 5;

counter++){

NSLog(@"Second iteration, counter = %lu", (unsigned long)counter);

}

}

void thirdIteration(void *paramContext){

NSUInteger counter = 0;

for (counter = 0;

counter < 5;

counter++){

NSLog(@"Third iteration, counter = %lu", (unsigned long)counter);

}

}

— (BOOL) application:(UIApplication *)application

didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{

dispatch_queue_t firstSerialQueue =

dispatch_queue_create(«com.pixolity.GCD.serialQueue1», 0);

dispatch_async_f(firstSerialQueue, NULL, firstIteration);

dispatch_async_f(firstSerialQueue, NULL, secondIteration);

dispatch_async_f(firstSerialQueue, NULL, thirdIteration);

self.window = [[UIWindow alloc] initWithFrame:

[[UIScreen mainScreen] bounds]];

self.window.backgroundColor = [UIColor whiteColor];

[self.window makeKeyAndVisible];

return YES;

}

7.11. Синхронное выполнение задач с помощью операций

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

Необходимо синхронно выполнить серию задач.

Решение

Создавайте операции и запускайте их вручную:

@interface AppDelegate ()

@property (nonatomic, strong) NSInvocationOperation *simpleOperation;

@end

Реализация делегата приложения такова:

— (void) simpleOperationEntry:(id)paramObject{

NSLog(@"Parameter Object = %@", paramObject);

NSLog(@"Main Thread = %@", [NSThread mainThread]);

NSLog(@"Current Thread = %@", [NSThread currentThread]);

}

— (BOOL) application:(UIApplication *)application

didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{

NSNumber *simpleObject = [NSNumber numberWithInteger:123];

self.simpleOperation = [[NSInvocationOperation alloc]

initWithTarget: self

selector:@selector(simpleOperationEntry:)

object: simpleObject];

[self.simpleOperation start];

self.window = [[UIWindow alloc] initWithFrame:

[[UIScreen mainScreen] bounds]];

self.window.backgroundColor = [UIColor whiteColor];

[self.window makeKeyAndVisible];

return YES;

}

Вывод этой программы (в окне консоли) будет примерно таким:

Parameter Object = 123

Main Thread = <NSThread: 0x68 10280>{name = (null), num = 1}

Current Thread = <NSThread: 0x68 10280>{name = (null), num = 1}

Из имени данного класса (NSInvocationOperation) понятно[6], что основное применение объекта такого типа связано с активизацией метода в объекте. Это наиболее непосредственный способ активизации метода в объекте с помощью операций.

Обсуждение

Операция активизации, как объяснялось в разделе 7.0, позволяет активизировать метод в объекте. «Что же в этом особенного?» — спросите вы. Потенциал активизирующей операции можно продемонстрировать, когда такая операция добавляется в операционную очередь. Примененная вместе с операционной очередью, активизирующая операция может асинхронно запустить метод в заданном объекте параллельно тому потоку, который начал операцию. Внимательно рассмотрев вывод с консоли (приведенный в подразделе «Решение» данного раздела), вы заметите, что актуальный поток в методе, запущенный активизирующей операцией, равен главному потоку. Действительно, главный поток в методе application: didFinishLaunchingWithOptions: запускает операцию, пользуясь ее методом start. В разделе 7.12 мы научимся эффективно использовать операционные очереди для асинхронного выполнения задач.

Кроме активизирующих операций, вы можете применять блоковые или обычные операции для синхронного выполнения задач. Вот пример использования блоковой операции для подсчета чисел от 0 до 999 (это происходит в. h-файле делегата приложения):

@interface AppDelegate ()

@property (nonatomic, strong) NSBlockOperation *simpleOperation;

@end

@implementation AppDelegate

А вот реализация делегата приложения (.m-файл):

— (BOOL) application:(UIApplication *)application

didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{

self.simpleOperation = [NSBlockOperation blockOperationWithBlock: ^{

Перейти на страницу:

Вандад Нахавандипур читать все книги автора по порядку

Вандад Нахавандипур - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки kniga-online.club.


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

Отзывы читателей о книге iOS. Приемы программирования, автор: Вандад Нахавандипур. Читайте комментарии и мнения людей о произведении.


Уважаемые читатели и просто посетители нашей библиотеки! Просим Вас придерживаться определенных правил при комментировании литературных произведений.

  • 1. Просьба отказаться от дискриминационных высказываний. Мы защищаем право наших читателей свободно выражать свою точку зрения. Вместе с тем мы не терпим агрессии. На сайте запрещено оставлять комментарий, который содержит унизительные высказывания или призывы к насилию по отношению к отдельным лицам или группам людей на основании их расы, этнического происхождения, вероисповедания, недееспособности, пола, возраста, статуса ветерана, касты или сексуальной ориентации.
  • 2. Просьба отказаться от оскорблений, угроз и запугиваний.
  • 3. Просьба отказаться от нецензурной лексики.
  • 4. Просьба вести себя максимально корректно как по отношению к авторам, так и по отношению к другим читателям и их комментариям.

Надеемся на Ваше понимание и благоразумие. С уважением, администратор kniga-online.


Прокомментировать
Подтвердите что вы не робот:*
Подтвердите что вы не робот:*