iOS 8 Today Widget中widgetPerformUpdateWithCompletionHandler的用途是什么?

ktz*_*ang 29 widget ios8 ios-app-extension

一直在寻找答案,但一切似乎都模糊或不清楚.

无论如何,只想知道功能的目的是什么:

widgetPerformUpdateWithCompletionHandler
Run Code Online (Sandbox Code Playgroud)

在今天的小部件中.

根据Apple的说法:

调用此方法可为窗口小部件提供更新其内容并在快照等操作之前重绘其视图的机会.当窗口小部件完成更新其内容(并在必要时重绘)时,窗口小部件应调用完成处理程序块,并传递相应的NCUpdateResult值.

快照什么时候发生?每当我调试扩展时,widgetPerformUpdateWithCompletionHandler总是在loadView之后被调用.那么当我已经在loadView中加载信息时,在此方法中显式重新加载信息的目的是什么?


根据这个网站:http://www.karlmonaghan.com/tag/today-widget/

在TodayViewController中,有两个地方需要从网络加载数据 - 创建窗口小部件时以及调用widgetPerformUpdateWithCompletionHandler时.对于前者,我在viewDidLoad中加载帖子,以便在窗口小部件显示时它们应该准备就绪.当iOS认为小部件在首次显示后将显示给用户时,将调用widgetPerformUpdateWithCompletionHandler,使小部件有机会更新显示的帖子.

与上述问题相同.

Kar*_*han 12

每次查看通知中心时都不会创建窗口小部件,因此loadView每次显示时都不会调用窗口小部件.当通知中心widgetPerformUpdateWithCompletionHandler认为需要更新小部件信息时,它会调用.从我自己的调试来看,它看起来就像最初创建窗口小部件时widgetPerformUpdateWithCompletionHandler几乎是直接调用,所以你可以在那里完成所有加载,但Apple建议你尽可能在生命周期的早期开始加载过程.

如果您的窗口小部件显示的信息永远不会更改,那么您无需执行任何操作widgetPerformUpdateWithCompletionHandler.

  • 据我所知,不仅每次显示窗口小部件时调用loadView,每次显示窗口小部件时都会*完全实例化*. (14认同)
  • iOS 8.1 beta的发行说明略微澄清了一点:widgetPerformUpdateWithCompletionHandler的计划和预期用途:旨在作为所有数据/模型更新逻辑的方便主页.如果实施,系统将在适当的时候调用窗口小部件,以便在通知中心可见时以及后台中更新其状态.需要实现才能启用后台更新.预计小部件将执行异步更新并尽可能远离主线程更新的工作. (8认同)
  • 截至2014-09-05 Xcode 6 beta 7仍然会在每次显示视图时触发awakeFromNib,即使滚动屏幕但今天仍然可见.想知道它实际上是如何工作的<@Apple>. (5认同)
  • 我应该更新widgetPerformUpdateWithCompletionHandler之外的信息吗?从我的调试看起来每次显示小部件时都会调用loadView ...所以基本上每当调用widgetPerformUpdateWithCompletionHandler时,也会调用loadView,因此在widgetPerformUpdateWithCompletionHandler中更新信息真的没有意义. (2认同)
  • 我观察到在8.0.2,Xcode 6.1(6A1046a)上,在iPhone 5(设备,而不是模拟器)上,实例化小部件,每次打开通知中心时都会调用loadView,viewDidLayoutSubviews,viewWillAppear和viewDidAppear.滚动窗口小部件时,我看到ViewWillAppear和ViewDidAppear被调用.我还没有观察到被调用的widgetPerformUpdateWithCompletionHandler.让通知中心长时间打开(15分钟左右),让通知中心关闭(再次,15分钟左右); 在我的测试中,这种方法都不会被调用. (2认同)
  • 我如何检测到正在查看或已被调用的小部件/今日扩展/通知中心?一旦用户撤出通知中心,我想执行特定任务. (2认同)