我的应用程序中有一个小部件,就像基本的天气小部件一样。

我想刷新小部件的内容而不让用户注意到这一点。

并根据Apple文档go to Updating Content
他们说:

为了帮助您的小部件保持最新状态,系统有时会捕获小部件视图的快照。当小部件再次变得可见时,将显示最新快照,直到系统将其替换为实时版本的视图为止。
要在拍摄快照之前更新小部件的状态,请确保符合NCWidgetProviding协议。

所以我使用 widgetPerformUpdate 更新我的小部件内容

但是会发生什么事,该应用程序会从MainInterface.storboard中显示“初始设计”,直到获取数据并更新屏幕为止,每次我向左或向右滑动时,都会获得“初始设计”,直到获得数据!

我的代码是:

func widgetPerformUpdate(completionHandler: (@escaping (NCUpdateResult) -> Void)) {

    getWeatherInfo()

    completionHandler(NCUpdateResult.newData)
}

任何人都知道问题所在以及如何解决?

谢谢。

最佳答案

您应该等待并首先获取weatherInfo,然后在completionHandler中启动widgetPerformUpdate,我将在getWeatherInfo()方法中添加一个完成代码块,如下所示:

将完成处理添加到getWeatherInfo方法
func getWeatherInfo(completion: (_ result: Bool) -> Void)
然后,当您完成了在getWeatherInfo方法中获取天气的操作后,调用完成模块,您可以在此处指定是否有新的天气数据,因此您可以
completion(true)(如果成功接收到天气),那么您就可以像这样重写widgetPerformUpdate:

func widgetPerformUpdate(completionHandler: (@escaping (NCUpdateResult) -> Void)) {
    getWeatherInfo { didUpdate in
        completionHandler(.newData)
        //you can check didUpdate and if it is false return .noData
    }
}

关于ios - 通过widgetPerformUpdate刷新今天的扩展内容,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46951806/

10-08 23:30