7

I am trying to run a function in certain ViewController using AppDelegate

func applicationDidBecomeActive(_ application: UIApplication) {
        ViewController().grabData()
}

But somehow the function does not seem to run at all when the app has become active after entering the app from the background.

The function looks like this

func grabData() {
        self._DATASERVICE_GET_STATS(completion: { (int) -> () in
            if int == 0 {
                print("Nothing")
            } else {
                print(int)

                for (_, data) in self.userDataArray.enumerated() {
                    let number = Double(data["wage"]!)
                    let x = number!/3600
                    let z = Double(x * Double(int))
                    self.money += z
                    let y = Double(round(1000*self.money)/1000)

                    self.checkInButtonLabel.text = "\(y) KR"
                }

                self.startCounting()
                self.workingStatus = 1
            }
        })
    }

And uses this var

var money: Double = 0.000

What have I missed?

Thanks!

Victor
  • 1,603
  • 4
  • 17
  • 24
  • 1
    http://stackoverflow.com/a/34745677/2303865 – Leo Dabus May 07 '17 at 12:54
  • 1
    Is the *certain* view controller the initial view controller? If yes create a property in `AppDelegate` and assign the reference to that view controller to the property. If not – the other way round – in `viewDidLoad()` of the *certain* controller get the AppDelegate instance and assign the reference from there. `Notification` is most likely not needed. – vadian May 07 '17 at 12:54

2 Answers2

14

ViewController().grabData() will create a new instance of the ViewController and call this function. Then.. as the view controller is not in use it will be garbage collected/removed from memory. You need to be calling this method on the actual view controller that is in use. Not a new instance of it.

The best option would be to listen for the UIApplicationDidBecomeActive notification that iOS provides.

NotificationCenter.default.addObserver(
    self,
    selector: #selector(grabData),
    name: NSNotification.Name.UIApplicationDidBecomeActive,
    object: nil)

make sure that you also remove the observer, this is usually done in a deinit method

deinit() {
    NotificationCenter.default.removeObserver(self)
} 
Scriptable
  • 19,402
  • 5
  • 56
  • 72
  • When should I remove the observer? – Victor May 07 '17 at 12:59
  • 1
    deinit is usually the best place to remove it. this means that as the view controller is de-initialised (released from memory) then it removes itself as an observer. I used to do this in viewDidUnload but this has been deprecated now – Scriptable May 07 '17 at 13:02
3

I simply solved it like this:

func applicationDidBecomeActive(_ application: UIApplication) {
        let viewController = self.window?.rootViewController as! ViewController
        viewController.grabData()
}
Victor
  • 1,603
  • 4
  • 17
  • 24