swift ios - How to run function in ViewController from AppDelegate

11,718

Solution 1

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)
} 

Solution 2

I simply solved it like this:

func applicationDidBecomeActive(_ application: UIApplication) {
        let viewController = self.window?.rootViewController as! ViewController
        viewController.grabData()
}
Share:
11,718
Victor
Author by

Victor

Updated on June 18, 2022

Comments

  • Victor
    Victor almost 2 years

    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!

  • Leo Dabus
    Leo Dabus about 7 years
    Don't do this. You should use the method posted by Scriptable
  • mike vorisis
    mike vorisis about 7 years
    If sometime you will need to do things like reload a tableview I thing that your app will crash
  • Victor
    Victor about 7 years
    When should I remove the observer?
  • Scriptable
    Scriptable about 7 years
    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