DarwinNotifyCenter
PreferenceLoaderからtweakの設定変更時の変更通知としてスタンダードになっているCFNotificationCenterのDarwinNotifyCenter
ですが、これはシステムグローバル用の通知として設計されており、
void CFNotificationCenterPostNotification(CFNotificationCenterRef center,
CFStringRef name,
const void *object,
CFDictionaryRef userInfo,
Boolean deliverImmediately);
CFNotificationCenterPostNotificationにおける引数object
, userinfo
, deliverimmediately
は無視されNULL
になります。であれば、有効な引数はname
だけなので、uint32_t notify_post(const char *name);
はcenterをDarwinでnameを引数に取りその他をNULLにした便利関数です。
通常であれば何か変更が入ったら全て設定値をロードしなおせば良いが、極々まれにそれでは都合が悪い場合(パフォーマンスとか)があります。何の設定が変更されたかをPreferenceBundleとして得る事はセッターを設定すると得られますが、それを対象のプロセスに伝える方法としてIPCをするのは大げさでちょいと面倒でした。
DistributedCenter
CFNotificationCenterRefには3種類あり、Darwin
, Local
, Distributed
の3種類があります。このうち、Distributed
はiOSではimportされない記述になっています。
#if (TARGET_OS_MAC && !(TARGET_OS_EMBEDDED || TARGET_OS_IPHONE)) || TARGET_OS_WIN32
CF_EXPORT CFNotificationCenterRef CFNotificationCenterGetDistributedCenter(void);
#endif
が、iOS 5からいつのまにか内部的には実装されていました。 サンプルコードはdev wikiに書きました。 Cloakyは1.6.3からこれを使用してステータスバーアイコンのON/OFF設定を検出しています。