swift ios - How to run function in ViewController from AppDelegate
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()
}
Victor
Updated on June 18, 2022Comments
-
Victor almost 2 years
I am trying to run a function in certain
ViewController
usingAppDelegate
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 about 7 yearsDon't do this. You should use the method posted by Scriptable
-
mike vorisis about 7 yearsIf sometime you will need to do things like reload a
tableview
I thing that your app will crash -
Victor about 7 yearsWhen should I remove the observer?
-
Scriptable about 7 yearsdeinit 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