the notification is sent each time the user goes to the view controller.
The notification is scheduled in viewDidLoad.
This suggests that when you leave firstViewController, it is destroyed.
So when you re-visit it, it is recreated, and the notification is scheduled again.
You don't include the supporting code, showing how firstViewController is instantiated...
... so you could either:
Keep firstViewController in memory, so it is not repeatedly created and destroyed
or
Save a Bool flag somewhere permanent (e.g. in your Data Model, or in the calling ViewController), to record that the notification has been scheduled (and test this flag, before scheduling the notification)
Tip: the class "firstViewController" should really be named with a capital first letter: "FirstViewController"