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