Параллелизм в среде Cocoa, Mac OS, iOS

В замен прямого создания и использования потоков Mac OS или iOS примите на вооружение асинхронный подход к программированию. Асинхронные функции присутствуют в операционных системах в течение многих лет и часто используются для реализации задач, которые могут занять много времени, такие как чтение данных с диска. При вызове асинхронная функция делает какую-то работу за кулисами, чтобы запустить задачу, но возвращается раньше, чем эта задача может быть фактически завершена. Как правило, эта работа включает в себя создание фонового потока, начиная с выполнения задачи в этом потоке, а затем отправляет уведомление абоненту (обычно с помощью функции обратного вызова), когда задача выполнена.

Одной из технологий для запуска задач асинхронно это Grand Central Dispatch (GCD). Эта технология имеет код управления потоками. Вы обычно пишите свои приложения и продвигаете код до системного уровня. Все, что вам нужно сделать, это определить задачи, которые вы хотите выполнить, и добавить их в соответствующую очередь отправки. GCD заботится о создании необходимых потоков и планирования Ваших задач для работы на этих потоках. Поскольку управление потоками является частью системы, GCD обеспечивает целостный подход к управлению и исполнению задач, обеспечивая лучшую эффективность, чем традиционные потоки.

Операция очереди (Operation queues) Objective-C объектов, действует очень похоже на отправку очереди. Необходимо определить задачи, которые вы хотите выполнить, а затем добавить их в очередь, которая занимается планированием и выполнением этих задач. Как и GCD, Operation queues обрабатывает все управление потоками за Вас, гарантируя, что задачи выполняются, как можно более быстро и эффективно в системе.

Отправка очереди

Отправка очереди (dispatch queue) - основанный на C механизм выполнения пользовательских задач. Задачи выполняются либо последовательно либо параллельно, но извлекаются из очереди в том-же порядке, как были туда добавлены, т.е. первый вошел - первый вышел.

Задачи, которые представляют отправку очереди должны быть заключены либо в функцию или блок объекта.

Отправка источников

Отправка источников (Dispatch Sources) C-механизм для обработки определенных типов системных событий в асинхронном режиме. Отправка источника инкапсулирует информацию о конкретном типе системных событий и представляет конкретный объект блок или функцию отправки очереди, всякий раз, когда происходит событие. Вы можете использовать отправку источников, чтобы контролировать следующие типы системных событий:

  • Таймеры
  • Обработчики сигналов
  • Дескриптор связанный с событием
  • Процесс связанный с событием
  • Событие связанное с портом Mach-ядра
  • Пользовательские события

Операция очереди

Операция очереди (Operation queues) эквивалент Cocoa одновременной очереди отправки и осуществляется NSOperationQueue классом. В то время как отправка очереди всегда выполняет задачи в порядке первый вошел, первым вышел, операция очереди принимает во внимание другие факторы при определении порядка выполнения задач. Основными среди этих факторов является ли данная задача, зависящей от завершения других задач. Можно настроить зависимости при определении своих задач и можно использовать их для создания более сложного графика порядка выполнения для ваших задач.

Задачи, которые предоставляют операции очереди должны быть экземплярами NSOperation класса.

close

Блок объект Читать более подробно

Блок объекты - синтаксические и выполняемые функций C-уровня, которые позволяют составить функцию выражения, которая может быть переданы в качестве аргумента, при необходимости хранения и использования в многопоточных приложениях. Функция выражения может ссылаться и может сохранить доступ к локальным переменным. В других языках и средах, блок объекта иногда называют закрытием или лямбдой. Вы можете использовать блок, когда вы хотите создать рабочие модули (то есть сегменты кода), которые могут быть переданы как будто они являются значениями. Блоки предлагают более гибкое программирование и больше возможностей. Вы можете использовать их, например, для написания обратных вызовов или для выполнения операции для всех элементов в коллекции.

Объявление блока

Во многих случаях, можно использовать встроенные блоки, поэтому вам не нужно объявлять их. Синтаксиса декларации, однако, похож на стандартный синтаксис указателей на функции, за исключением того, что вы используете вставки (^) вместо звездочки указателя (*). Например, следующий код объявляет переменную aBlock, который ссылается на блок, который требует трех параметров и возвращает значение с плавающей точкой:

float (^aBlock)(const int*, int, float);

Создание блока

Вы можете использовать вставки (^) оператора для обозначения начала и точку с запятой, чтобы обозначить конец блока выражения. В следующем примере объявляется простой блок и относит его к ранее объявленной блоком переменной (oneFrom):

int (^oneFrom)(int);

oneFrom = ^(int anInt) {
    return anInt - 1;
};

Закрытие точкой с запятой требуется в качестве стандарта C конца линии маркера.

Если вы явно не объявляете возвращаемое значение выражения блока, оно может автоматически выводится из содержимого блока.

Блок-изменяемые переменные

Вы можете использовать __block модификатор хранения c переменными, объявленными локально с вложениями лексической области, чтобы обозначить, что такие переменные должны быть предоставлены по ссылке в блоке и являются изменяемыми. Любые изменения находят свое отражение в окружающей лексической области, в том числе любых других блоков, определенных в той же ограждающей лексической области.

Использование блоков

Если вы объявляете блок в качестве переменной, вы можете использовать его так же, как функцию. В следующем примере печатается 9.

printf("%d\n", oneFrom(10));

Обычно, передают блок в качестве аргумента функции или методу. В этих случаях часто создают блок линию.

В следующем примере определяется, содержит ли объект NSSet слово, указанное в локальной переменной и задает значение другой локальной переменной (found) в YES (и прекращает поиск), если он выполняется. В этом примере, found объявлена ​​как переменная __block.

__block BOOL found = NO;
NSSet *aSet = [NSSet setWithObjects: @"Alpha", @"Beta", @"Gamma", @"X", nil];
NSString *string = @"gamma";

[aSet enumerateObjectsUsingBlock:^(id obj, BOOL *stop) {
    if ([obj localizedCaseInsensitiveCompare:string] == NSOrderedSame) {
        *stop = YES;
        found = YES;
    }
}];

// В этой точке, found == YES

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

Операции сравнения

Одной из наиболее распространенных операций, которые вы выполняете с блоками в среде Cocoa сравнение двух объектов, сортировка содержимого массива. Среда выполнения Objective-C определяет блок типа NSComparator для использования этих сравнений.

 
 
homeЗаметили ошибкукарта сайта 
   Made on a Mac