swift ios - Как запустить функцию в ViewController из AppDelegate

Я пытаюсь запустить функцию в определенных ViewController, используя AppDelegate

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

Но почему-то функция вообще не запускается, когда приложение становится активным после входа в приложение из фона.

Функция выглядит так

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

И использует этот var

var money: Double = 0.000

Что я пропустил?

Спасибо!


person Victor    schedule 07.05.2017    source источник
comment
stackoverflow.com/a/34745677/2303865   -  person Leo Dabus    schedule 07.05.2017
comment
Является ли определенный контроллер представления начальным контроллером представления? Если да, создайте свойство в AppDelegate и назначьте этому свойству ссылку на этот контроллер представления. Если нет - наоборот - в viewDidLoad() определенного контроллера получить экземпляр AppDelegate и назначить ссылку оттуда. Notification скорее всего не нужен.   -  person vadian    schedule 07.05.2017


Ответы (2)


ViewController().grabData() создаст новый экземпляр ViewController и вызовет эту функцию. Затем ... поскольку контроллер представления не используется, он будет удален из памяти сборщиком мусора. Вам необходимо вызвать этот метод на фактическом используемом контроллере представления. Не новый его экземпляр.

Лучшим вариантом будет прослушивание UIApplicationDidBecomeActive уведомления, которое предоставляет iOS.

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

убедитесь, что вы также удалили наблюдателя, обычно это делается deinit методом

deinit() {
    NotificationCenter.default.removeObserver(self)
} 
person Scriptable    schedule 07.05.2017
comment
Когда мне следует удалить наблюдателя? - person Victor; 07.05.2017
comment
deinit - обычно лучшее место для его удаления. это означает, что когда контроллер представления деинициализирован (освобождается из памяти), он удаляется как наблюдатель. Раньше я делал это в viewDidUnload, но теперь это устарело - person Scriptable; 07.05.2017

Я просто решил это так:

func applicationDidBecomeActive(_ application: UIApplication) {
        let viewController = self.window?.rootViewController as! ViewController
        viewController.grabData()
}
person Victor    schedule 07.05.2017
comment
Не делай этого. Вы должны использовать метод, опубликованный Scriptable - person Leo Dabus; 07.05.2017
comment
Если когда-нибудь вам понадобится перезагрузить tableview I вещь, ваше приложение выйдет из строя - person mike vorisis; 07.05.2017