Singleton that holds the app's data
The problem I see there is that when a new view controller subscribes, the previous one stops receiving notifications. There reason is because delegation is a one to one relationship.

"View controllers can subscribe to its delegate" That is wrong, it should be something like: "A view controller can subscribe to its delegate"

If that is what you want, then it is OK.

On the other hand, if you want to have several view controllers listening for those events, you need a 1 to many relationship. You can use NoticationCenter, KVO, Observables (RxSwift or Combine), or create your own solution, like:

addObserver removeObserver an array to save these observers (that conform to a protocol) and when triggering the event, just use observers.forEach { $0.sendEvent... }