CF еквивалент на [NSNotificationCenter defaultCenter]

Искам да използвам cpp функция като обратно извикване на наблюдател. Извън CFNotificationCenterGetDarwinNotify/Distributed/LocalCenter, CFNotificationCenterGetLocalCenter изглежда най-близо до [NSNotificationCenter defaultCenter].

Еквивалентен ли е CFNotificationCenterGetLocalCenter на [NSNotificationCenter defaultCenter]?

РЕДАКТИРАНЕ: съмнявам се, защото отговор тук казва - Не можете да добавите наблюдател чрез C++ клас, но този тук казва - Можете да добавите наблюдател в C++ клас чрез CF функции.


person Nitesh    schedule 15.06.2013    source източник


Отговори (2)


NSNotificationCenter и CFNotificationCenter са не безплатни мостови връзки (вижте: окончателен списък с безплатни мостови типове), така че ако се опитвате да получавате известия, публикувани от AppKit на конкретното копие на NSNotificationCenter, върнато от +[NSNotificationCenter defaultCenter], това би изглеждало най-безопасно< /em> за използване на Objective-C, най-малкото за взаимодействие с този екземпляр на NSNotificationCenter. Вашият Objective-C клас може да бъде доста тънък и просто да се обади до вашия C++ клас, но няма как да избегнете Objective-C, ако това са конкретните известия, които искате да получавате.

РЕДАКТИРАНЕ: Емпирично, да, публикуването на известие до единия изглежда кара известието да бъде получено от другия според коментара, който сте копирали и поставили. Въпреки това не виждам каквото и да е споменаване на това поведение нито в Референтната страница на CFNotificationCenter, нито Референтна страница на NSNotificationCenter, нито изглежда спомената в Ръководство за програмиране на известия, така че да се разчита на такава недокументирана подробност за изпълнение изглежда рисковано.

person ipmcc    schedule 15.06.2013
comment
Отговорът във втория свързан въпрос има коментар: Не, CFNotificationCenter не е свързан безплатно с NSNotificationCenter. Така персонализиран екземпляр на нито един от тях няма да може да се използва в другия API. Въпреки това, ако използвате стандартен център в едно от двете (напр. CFNotificationCenterGetLocalCenter() или [NSNotificationCenter defaultCenter]) и публикувате известие в него, известието се публикува и до двата набора слушатели (т.е. интерфейсите са различни, но основната система е същото.) Това ме кара да вярвам, че мога да слушам централното известие по подразбиране в cpp - person Nitesh; 15.06.2013
comment
И да, винаги има опция да имате посреднически или слепващи класове, но защо да използвате това, ако системата предоставя други средства? Просто искам да получавам известие по име - person Nitesh; 15.06.2013
comment
Редактирано с предупреждение. Честно казано, ако се опитвате да получавате известия от AppKit, ако не работите с идиома на AppKit (т.е. Objective-C), изглежда, че правите ненужна работа за себе си, но разбирам, че някои хора имат силни чувства към езиците за програмиране. - person ipmcc; 15.06.2013
comment
Недокументирани подробности за изпълнението - Точно това си помислих за това и затова публикувах въпроса, така че ако някой, който знае, че това е дефинирано поведение, може да публикува връзка. - person Nitesh; 15.06.2013
comment
Доста съм уверен, че ако това беше публично, документирано поведение, някакво споменаване за него щеше да се появи на една от страниците, към които направих връзка, но също така не претендирам за изчерпателно актуално познаване на цялата документация на Apple. Както и да тръгнете, вероятно ще бъде добре. От една страна, клас лепило ~10 линии изглежда като малка цена, но от друга страна, не мога да си представя, че това е поведение, което се променя много често. Друга мисъл може да бъде да проследите система, работеща с 10.5, и да видите дали поведението е същото там. Ако не се е променило от 10.5, изглежда малко вероятно да се промени скоро. - person ipmcc; 15.06.2013

Най-добрият начин да използвате C++ обратно извикване за известие може да бъде да използвате -[NSNotificationCenter addObserverForName:object:queue:usingBlock:] с малък лепен блок към вашия C++ код.

person microtherion    schedule 15.06.2013
comment
Това наистина изглежда най-добрият начин. Трябва ли да запазя наблюдателя, върнат от addObserverForName и да го освободя след премахване на наблюдателя? Добавям наблюдател в C++ клас ctor и премахвам наблюдател в dtor. - person Nitesh; 15.06.2013
comment
Не е необходимо да го запазвате (заглавията казват, че върнатата стойност се запазва от системата), но трябва да запазите (незапазена) препратка към него във вашия C++ обект, така че да можете да го предадете обратно на removeObserver: във вашия dtor . - person ipmcc; 15.06.2013