NSNotification — наблюдатель с несколькими событиями для запуска

В своем нынешнем виде NSNotifications позволяют использовать механизм целевого действия в ответ на одно сообщение/событие.

Я хотел бы иметь уведомление, которое запускает действие (запускает функцию) только после того, как были запущены два события.

Сценарий заключается в том, что у меня есть два асинхронных процесса, которые необходимо завершить, прежде чем я смогу вызвать функцию. Возможно, я что-то упускаю, но я не нашел способа сделать это. Или, может быть, я не думаю об очевидной причине, почему это было бы действительно плохой идеей?

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


person wllychng    schedule 14.06.2015    source источник


Ответы (1)


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

Если вы используете NSOperationQueue, вы можете добавить третью операцию, которая имеет две другие операции в качестве зависимости. Таким образом, вам вообще не придется заботиться об уведомлениях.

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

Сначала вы создаете группу рассылки:

let group = dispatch_group_create()

Затем вы вводите группу для каждого фонового процесса:

dispatch_group_enter(group)

Наконец, вы можете зарегистрировать блок, который вызывается, когда группа становится пустой, то есть когда каждый dispatch_group_enter уравновешивается с помощью dispatch_group_leave:

dispatch_group_notify(group, dispatch_get_main_queue()) {
   // All processes are done.
}

После завершения каждого из ваших процессов вы снова покидаете группу:

dispatch_group_leave(group)

Важно вызвать dispatch_group_enter перед вызовом dispatch_group_notify, иначе ваш блок будет запланирован немедленно, так как группа уже пуста.

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

person Sven    schedule 14.06.2015
comment
Спасибо, это было именно то, что я искал. Для других людей, читающих ответ, решили использовать NSOperationQueue / NSOperation Я обнаружил, что NSInvocationOperation, один из конкретных подклассов NSOperation, не используется - person wllychng; 15.06.2015