Как я могу отправить пользовательскую информацию, используя CFNotificationCenterGetDarwinNotifyCenter()
Мне нужно отправить объект, используя CFNotificationCenterGetDarwinNotifyCenter()
Тем не менее, я замечаю, что всякий раз, когда я отправляю уведомление, используя
const void *tkeys[1] = { @"testKey" };
const void *tvalues[1] = { @"testValue" };
CFDictionaryRef userInfo = CFDictionaryCreate(NULL, tkeys, tvalues, 1, NULL, NULL);
CFNotificationCenterPostNotification(CFNotificationCenterGetDarwinNotifyCenter(),
CFSTR("foo"),
object,
userInfo,
true);
затем я нахожу, что в обратном вызове наблюдателя userInfo dict равен NULL. Есть что-то, чего я здесь не хватает? Есть ли какой-то другой способ, которым я могу отправить объект userInfo? Я просматривал http://nshipster.com/inter-process-communication/ и часть "Распределенные уведомления", однако всякий раз, когда я использую:
CFNotificationCenterRef distributedCenter =
CFNotificationCenterGetDistributedCenter();
тогда я получаю ошибку Invalid Use of Function
ошибка всякий раз, когда я пытаюсь это сделать.
1 ответ
Если вы читаете документацию для CFNotificationCenterGetDarwinNotifyCenter
вы найдете это предостережение:
Дарвинские центры уведомлений игнорируют некоторые параметры функции. Чтобы обеспечить совместимость в будущем, вы должны передать NULL или 0 для всех игнорируемых аргументов.
userInfo
является одним из тех параметров. CFNotificationCenter.h
детализируется:
// For this center, there are limitations in the API. There are no notification "objects",
// "userInfo" cannot be passed in the notification, ...
// - CFNotificationCenterPostNotification(): the 'object', 'userInfo', and 'deliverImmediately' arguments are ignored.
Зачем? Копай немного глубже. В документации также упоминается, что этот тип центра уведомлений основан на механизме уведомлений ОС Core, объявленном в notify.h
, Если вы посмотрите это, вы обнаружите, что есть только один способ опубликовать уведомление, позвонив notify_post()
, который принимает только один строковый аргумент. Нет возможности добавить дополнительные данные в уведомление. Это очень старый и элементарный механизм IPC, который ничего не знает о структурах данных CoreFoundation.
Что касается CFNotificationCenterGetDistributedCenter
, это не доступно на iOS.