应用程序在前台时如何更新UI?

时间:2019-01-14 09:54:01

标签: ios swift push-notification foreground

当我的应用程序处于活动状态并且从服务器接收到一个静默通知以使用新数据更新表视图时,我正在调用以下函数,在该函数中我向服务器发出请求以携带最新数据,然后重新加载该特定行。

func updateCell(path: Int, messageId: String) {
    let indexPath = IndexPath(item: path, section: 0)
    if let visibleIndexPaths = mainTableView.indexPathsForVisibleRows?.index(of: indexPath as IndexPath) {
        if visibleIndexPaths != NSNotFound {
            if let id = self.userData?.id {
                let conversationID = String(describing: id)
                ServerConnection.getSpecificMessage(conversationId: conversationID, messageId: messageId) { (dataMessage) in
                    if let message = dataMessage {
                        self.chat[path] = message
                        self.mainTableView.beginUpdates()
                        self.mainTableView.reloadRows(at: [indexPath], with: .fade)
                        self.mainTableView.endUpdates()
                    }
                }
            }
        }
    }
}

我的问题是,当我的应用程序位于前台时,由于API请求无法在前台/后台完成,因此流程不再起作用。

控制台日志显示:

  

加载失败,错误为Error Domain = NSPOSIXErrorDomain代码= 53“软件导致连接中止”

我尝试用

修改功能
let state = UIApplication.shared.applicationState
    if state == .background || state == .inactive {
        NotificationCenter.default.addObserver(self, selector: #selector(self.reloadData(_:)), name: NSNotification.Name("BackgroundReload"), object: nil)
    }

并在AppDelegate中发布了此“ BackgroundRelod”通知

  

func applicationWillEnterForeground(_ application:UIApplication)

但这将始终触发我的功能,即使我没有收到任何静默通知来更新UI。

1 个答案:

答案 0 :(得分:1)

您不应该依赖更新中的后台模式,只要在此处有静默通知进入后台时,您只需要修改变体语needsUpdate

func application(_ application: UIApplication,
                 didReceiveRemoteNotification userInfo: [AnyHashable : Any],
                 fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {

然后

NotificationCenter.default.addObserver(self, selector: #selector(update), name: UIApplication.willEnterForegroundNotification, object: nil)

@objc func ppp(_ no:NSNotification) {

    if needsUpdate {

        // pull here
    }

}