List NotificationCenter Observers
May 14, 2017
If you want to find out which observers are currently registered in NotificationCenter
, break and print its debug description:
✅(lldb) e print(NotificationCenter.default.debugDescription)
<NSNotificationCenter:0x6000000dc540>
Name, Object, Observer, Options
com.apple.accessibility.SpeakThisEnabled, 0x11088e490, 0x7fcebcc00f10, 1001
com.apple.accessibility.text.legibility.status, 0x11088e490, 0x7fcebcc00f10, 1001
com.apple.accessibility.text.legibility.status, 0x11088e490, 0x608000024220, 1400
UITextEffectsWindowDidRotateNotification, 0x11088e490, 0x7fcebce071a0, 1400
com.apple.accessibility.reduce.motion.status, 0x11088e490, 0x7fcebcc00f10, 1001
UIWindowDidBecomeHiddenNotification, 0x11088e490, 0x60800017be40, 1400
UIDeviceOrientationDidChangeNotification, 0x11088e490, 0x7fcebcc06c20, 1400
… etc.
As we can see from the column headers, each row contains Name
, Object
, Observer
, Options
.
Multiple calls to NotificationCenter.default.addObserver
with some NSNotification.Name
will result in multiple entries in this list—useful to check if a observer hasn’t been added too often!
My solution is based on useyourloaf’s “bonus tip”, that he found in Foundation Release Notes for OS X v10.11 and iOS 9.
However, when trying his tip in Xcode 8.3.2 (8E2002) on a Swift 3 code base aimed at iOS Deployment Target 8.0, we
• (per default) get a truncated list of the observers, so we need to increase the target.max-string-summary-length
, but also
• don’t get line-breaks in the console output, so it’s harder to read.
…as we can see from the following example:
(lldb) p NotificationCenter.default.debugDescription
(String) $R0 = "<NSNotificationCenter:0x6080000caa30>\nName, Object, Observer, Options\ncom.apple.accessibility.SpeakThisEnabled, 0x10f6b0490, 0x7f92a9e01240, 1001\ncom.apple.accessibility.text.legibility.status, 0x10f6b0490, 0x7f92a9e01240, 1001\ncom.apple.accessibility.text.legibility.status, 0x10f6b0490, 0x600000035e00, 1400\nUITextEffectsWindowDidRotateNotification, 0x10f6b0490, 0x7f92a9f0bea0, 1400\ncom.apple.accessibility.reduce.motion.status, 0x10f6b0490, 0x7f92a9e01240, 1001\nUIWindowDidBecomeHiddenNotification, 0x10f6b0490, 0x6080001774c0, 1400\nUIDeviceOrientationDidChangeNotification, 0x10f6b0490, 0x7f92a9f0e020, 1400\nPBDefaultCoercionRegistryDidInstantiateNotification, 0x10f6b0490, 0x60800005d370, 1400\n_UIApplicationForcedUserInterfaceLayoutDirectionChangedNotification, 0x10f6b0490, 0x7f92a9f01960, 1400\n_UIApplicationForcedUserInterfaceLayoutDirectionChangedNotification, 0x10f6b0490, 0x7f92a9f01470, 1400\nUITextInputCurrentInputModeDidChangeNotification, 0x10f6b0490, 0x7f92a9f0bea0, 1400\ncom.apple.accessibility.monoaudio."...
(lldb) set set target.max-string-summary-length 50000
(lldb) p NotificationCenter.default.debugDescription
(String) $R1 = <this time the entire list>
Fortunately, I previously found a solution to the line formatting of an Alamofire debugDescription in Xcode console that I could apply here as well.