/* Считываем числа с диска и сортируем их в порядке возрастания. */

dispatch_sync(concurrentQueue, ^{

/* Если файл на данный момент уже создан, занимаемся его считыванием. */

if ([self hasFileAlreadyBeenCreated]){

randomNumbers = [[NSMutableArray alloc]

initWithContentsOfFile: [self fileLocation]];

/* Теперь сортируем числа. */

[randomNumbers sortUsingComparator:

^NSComparisonResult(id obj1, id obj2) {

NSNumber *number1 = (NSNumber *)obj1;

NSNumber *number2 = (NSNumber *)obj2;

return [number1 compare: number2];

}];

}

});

dispatch_async(dispatch_get_main_queue(), ^{

if ([randomNumbers count] > 0){

/* Обновляем пользовательский интерфейс, задействуя числа

из массива randomNumbers. */

}

});

});

}

Функционал GCD далеко не ограничивается синхронным или асинхронным выполнением блоков кода или функций. В разделе 7.9 вы научитесь группировать блоковые объекты и готовить их к выполнению в диспетчерской очереди. Кроме того, рекомендую вам изучить разделы 7.7. и 7.8, где говорится о прочих функциях, которые предоставляются программисту в GCD.

<p>См. также</p>

Разделы 7.4, 7.7 и 7.8.

<p>7.7. Выполнение задач после задержки с помощью GCD</p><p>Постановка задачи</p>

Требуется выполнить код, но после определенной задержки. Задержку планируется указывать с помощью GCD.

<p>Решение</p>

Воспользуйтесь функциями dispatch_after и dispatch_after_f.

<p>Обсуждение</p>

Работая с фреймворком Core Foundation, можно активизировать селектор в объекте по истечении заданного временного промежутка с помощью метода performSelector: withObject: afterDelay:, относящегося к классу NSObject. Например:

— (void) printString:(NSString *)paramString{

NSLog(@"%@", paramString);

}

— (BOOL) application:(UIApplication *)application

didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{

[self performSelector:@selector(printString:)

withObject:@"Grand Central Dispatch"

afterDelay:3.0];

self.window = [[UIWindow alloc] initWithFrame:

[[UIScreen mainScreen] bounds]];

// Точка переопределения для настройки после запуска приложения

self.window.backgroundColor = [UIColor whiteColor];

[self.window makeKeyAndVisible];

return YES;

}

В данном примере мы приказываем среде времени исполнения вызвать метод printString: после трехсекундной задержки. Ту же операцию можно осуществить и в GCD с помощью функций dispatch_after и dispatch_after_f. Обе эти функции описаны далее.

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

• задержка в наносекундах — количество наносекунд, в течение которых длится ожидание в определенной диспетчерской очереди в GCD (указываемой во втором параметре), после чего выполняется блоковый объект (задаваемый в третьем параметре);

• диспетчерская очередь — диспетчерская очередь, в которой должен быть выполнен блоковый объект (указываемый в третьем параметре) после определенной задержки (задаваемой в первом параметре);

• блоковый объект — блоковый объект, который должен быть активизирован в заданной диспетчерской очереди по истечении заданного количества наносекунд. Блоковый объект не должен иметь возвращаемого значения и не должен принимать никаких параметров (см. раздел 7.1).

• dispatch_after_f — направляет функцию на языке C в GCD для выполнения по истечении указанного периода времени, задаваемого в наносекундах. Данная функция принимает четыре параметра:

• задержка в наносекундах — количество наносекунд, в течение которых длится ожидание в определенной диспетчерской очереди в GCD (указываемой во втором параметре), после чего выполняется заданная функция (задаваемая в четвертом параметре);

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

Все книги серии Бестселлеры O'Reilly

Похожие книги