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

Я хочу использовать функцию cpp в качестве обратного вызова наблюдателя. Вне CFNotificationCenterGetDarwinNotify/Distributed/LocalCenter CFNotificationCenterGetLocalCenter кажется наиболее близким к [NSNotificationCenter defaultCenter].

Является ли CFNotificationCenterGetLocalCenter эквивалентом [NSNotificationCenter defaultCenter]?

РЕДАКТИРОВАТЬ: я сомневаюсь, потому что ответ здесь говорит: вы не можете добавить наблюдателя через класс С++, но один здесь говорит - Вы можете добавить наблюдателя в класс 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, и освобождать его после удаления наблюдателя? Я добавляю наблюдателя в ctor класса C++ и удаляю наблюдателя в dtor. - person Nitesh; 15.06.2013
comment
Вам не нужно сохранять его (заголовки говорят, что возвращаемое значение сохраняется системой), но вам нужно сохранить (несохраненную) ссылку на него в вашем объекте C++, чтобы вы могли передать его обратно в removeObserver: в вашем dtor . - person ipmcc; 15.06.2013