我有一些正在从firebase进行更新的值,我正在调用用于更新viewdidload()内的值的函数,当安装该应用程序时,这些值已更新,然后我发送了一个更新,该更新基本上要求我关闭应用程序两次,直到值更新为止,不确定一次关闭后iphone是否将其保留在内存中?
我尝试添加viewWillAppear和viewDidAppear尝试解决此问题,但均未执行任何操作。在打开应用程序时,是否有一种方法可以重新加载视图,即使该应用程序尚未关闭且处于后台也是如此。
这项工作将通过应用程序委托进行吗?如何从那里更新ViewController?
谢谢。
答案 0 :(得分:0)
您可以从AppDelegate处理它。
使用可选应用程序确实成为活动方法。
func applicationDidBecomeActive(_ application: UIApplication)
调用此方法是为了让您的应用知道它已从非活动状态变为活动状态。您应使用此方法重新启动应用程序处于非活动状态时已暂停(或尚未启动)的所有任务。
编辑以显示如何获得所需的控制器。 检查其中的控制器:
func applicationDidBecomeActive(_ application: UIApplication) {
let appDelegate: AppDelegate? = UIApplication.shared.delegate as? AppDelegate
if let controller = appDelegate?.window?.rootViewController {
if let navigationController: UINavigationController = controller as? UINavigationController {
let viewControllers: [UIViewController] = navigationController.viewControllers
for viewController in viewControllers {
// Check for your view controller here
}
} else if let viewController: UIViewController = controller as? UIViewController {
// Check for your view controller here
} else if let tabController: UITabBarController = controller as? UITabBarController {
// Narrow the hierarchy and check for your view controller here
}
}
}
答案 1 :(得分:0)
从firebase加载数据后,您必须在tableView.reloadData()
中调用方法viewDidLoad()
。
例如,看看我的例子:
// no matter what you have collectionView or tableView
@IBOutlet private weak var cardsCollectionView: UICollectionView!
// data from firebase stored in the array
private var cards: [Card]?
override func viewDidLoad() {
super.viewDidLoad()
DatabaseService.shared.loadDataFromDb { (cards) in
DispatchQueue.main.async {
// update of array with new data
self.cards = cards
// update of view
self.cardsCollectionView.reloadData()
}
}
}
答案 2 :(得分:0)
最好听UIApplication.didBecomeActiveNotification
,当应用程序从后台转到前台时,iOS会发送此通知。
例如,可以在控制器的viewDidLoad
方法中为该通知安装处理程序。
override func viewDidLoad() {
super.viewDidLoad()
NotificationCenter.default.addObserver(self,
selector: #selector(handleAppDidBecomeActiveNotification(notification:)),
name: UIApplication.didBecomeActiveNotification,
object: nil)
}
您的处理程序将只是在同一视图控制器中要在收到此通知时调用的方法。通过这种方法,您可以重新加载数据或执行任何您想做的事情
@objc func handleAppDidBecomeActiveNotification(notification: Notification) {
reloadData()
}
当然,在关闭视图控制器时,请不要忘记为UIApplication.didBecomeActiveNotification
注销。例如,在控制器的deinit
方法中
deinit {
NotificationCenter.default.removeObserver(self)
}
通过这种方式,重新加载的逻辑和触发重新加载的逻辑将封装在每个视图控制器中,而应用程序委托人将不知道哪个更好。