2017-02-13 10 views
0

Мне нужно, чтобы код запускался каждый раз, когда приложение открывается, в том числе, если оно было приостановлено (пользователь нажал кнопку дома, а затем вернулся в приложение).Run Code Every Time App Opens - лучший способ?

Я уже знаю, что viewDidLoad загружается только на начальную нагрузку VC, так что не делает то, что мне нужно. И viewWillAppear/viewDidAppear тоже не делают этого. Эта нить SO имеет an answer, но это от шести лет назад, и я не люблю ответа. По сути, это говорит о создании наблюдателя. Однако это кажется пустой тратой ресурсов, и наблюдатели создают те опорные петли, которые хранят вещи в памяти.

Если никто не дает мне лучшего решения, я могу попробовать «applicationDidBecomeActive» в AppDelegate, но я стараюсь не загружать свой appDelegate с кодом ViewController.

Мой вопрос заключается в том, что за шесть лет, прошедших с тех пор, как эта нить была услышана, действительно ли Swift/iOS10 разрешает более чистое решение?

+0

Не рекомендуется вводить какой-либо код контроллера вида в AppDelegate, однако вполне нормально пересылать его методы контроллеру вида: https://en.wikipedia.org/wiki/Forwarding_(object-oriented_programming). – user3581248

+0

Обратите внимание на это https://developer.apple.com/reference/uikit/uiapplicationdidbecomeactivenotification – ogres

ответ

5

Если вы не хотите использовать NSNotificationCenter, чем сделать глобальный объект вашего ViewController в AppDelegate

и поместить код в applicationDidBecomeActive с объектом ViewController

Поскольку applicationDidBecomeActive звонки каждый раз, когда вы начинаете свое приложение и когда вы нажимаете кнопку «Домой» и выходите из фона, поэтому вам не нужно писать свой код в viewWillAppear.

+0

Спасибо, что сработало !. Спас день –

0

Насколько я могу судить после дополнительных исследований, с этой должности шесть лет назад нет нового пути. Однако applicationDidBecomeActive подход работает хорошо:

func applicationDidBecomeActive(_ application: UIApplication) { 
    guard let rvc = self.window?.rootViewController as? firstVCName else { return } 
    rvc.nameOfMethodYouWantToCall() 
} 

выше получает ссылку на существующий VC (вместо того, чтобы создавать совершенно новый экземпляр). Затем он вызывает этот метод, не загружая приложение appDelegate кодом. Очень простой и эффективный.

Я тестировал это, и это именно то, что мне нужно, код, который запускается каждый раз, когда приложение открыто. Это очень непротиворечиво.

 Смежные вопросы

  • Нет связанных вопросов^_^