Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/117.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 当应用程序激活时,快速查看重新加载_Ios_Swift_Firebase - Fatal编程技术网

Ios 当应用程序激活时,快速查看重新加载

Ios 当应用程序激活时,快速查看重新加载,ios,swift,firebase,Ios,Swift,Firebase,我有从firebase更新的值,我正在调用更新viewdidload()中的值的函数,当安装应用程序时,值会更新,然后我发送一个更新,基本上要求我关闭应用程序两次,直到值更新,不确定iphone是否在1次关闭后仍将其保留在内存中 我尝试添加ViewWillDisplay和ViewDidDisplay来尝试修复此问题,但都没有做任何操作。是否有方法在应用程序打开时重新加载视图,即使它未关闭且处于后台 通过app delegate可以完成吗?如何从那里更新viewcontroller 谢谢。您可以通

我有从firebase更新的值,我正在调用更新viewdidload()中的值的函数,当安装应用程序时,值会更新,然后我发送一个更新,基本上要求我关闭应用程序两次,直到值更新,不确定iphone是否在1次关闭后仍将其保留在内存中

我尝试添加ViewWillDisplay和ViewDidDisplay来尝试修复此问题,但都没有做任何操作。是否有方法在应用程序打开时重新加载视图,即使它未关闭且处于后台

通过app delegate可以完成吗?如何从那里更新viewcontroller


谢谢。

您可以通过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
     }
   }
}

从firebase加载数据后,必须在
viewDidLoad()
中调用方法
tableView.reloadData()

例如,看看我的例子:

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

最好是监听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)
}

这样,重新加载的逻辑和触发重新加载的内容将封装在每个视图控制器中,应用程序代理将不知道哪个更好。

感谢您的帮助,我将如何从那里调用viewcontroller中的函数。我尝试调用一个函数,结果出现错误“致命错误:在展开可选值时意外发现nil”。对不起,我是swift新手,不确定是否应该执行其他操作来调用那里的某个函数?谢谢您的帮助,我是这样实现的。有没有理由认为这比AppDelegate更好?两种方法似乎都很有效