iOS 8的今日小部件中,widgetPerformUpdateWithCompletionHandler的目的是什么?

29

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

无论如何,只想知道以下函数的目的:

widgetPerformUpdateWithCompletionHandler

在今日小部件中进行了什么操作。

根据Apple:

调用此方法以便小部件有机会更新其内容并在操作(例如快照)之前重新绘制其视图。当小部件完成更新其内容(如果需要重新绘制),小部件应调用完成处理程序块,传递适当的NCUpdateResult值。

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


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

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

与上面的问题相同。













酷,我刚意识到Karl Monaghan实际上找到了这个问题。 - ktzhang
系统会对小部件进行快照,并定期尝试更新它。如果更新成功,该函数将使用NCUpdateResult.NewData枚举调用系统提供的完成块。如果更新失败,则使用现有的快照。 - onmyway133
1个回答

12
小部件并非每次查看通知中心时都会创建,因此每次显示时不会调用loadView。相反,当通知中心认为需要更新小部件信息时,它将调用widgetPerformUpdateWithCompletionHandler。从我的调试结果来看,当小部件最初创建时,widgetPerformUpdateWithCompletionHandler几乎立即被调用,因此您可以在其中进行所有加载,但是Apple建议您尽早在生命周期中启动加载过程。
如果您的小部件显示的信息永远不会改变,则不必在widgetPerformUpdateWithCompletionHandler中执行任何操作。

2
我应该在widgetPerformUpdateWithCompletionHandler之外更新信息吗?从我的调试结果来看,每次小部件显示时都会调用loadView...所以基本上无论何时调用widgetPerformUpdateWithCompletionHandler,loadView也会被调用,因此在widgetPerformUpdateWithCompletionHandler中更新信息实际上没有意义。 - ktzhang
15
据我所知,loadView方法不仅在显示部件时每次都会被调用,而且每次显示部件时它都会被完全实例化 - John Scalo
5
截至2014年9月5日,Xcode 6 beta 7仍会在每次显示视图时触发awakeFromNib,即使滚动到屏幕外但“Today”面板仍可见。希望知道它实际上是如何工作的<@Apple>。 - Chris Paveglio
8
iOS 8.1 beta 的发布说明澄清了一些内容:widgetPerformUpdateWithCompletionHandler: 的时间表和预期用途是方便所有数据/模型更新逻辑的统一归宿。如果实现,系统会在合适时机调用该方法,以便小组件在通知中心可见以及后台更新其状态。必须实现此方法才能启用后台更新。预计小组件将尽可能异步且脱离主线程地执行更新工作。 - Karl Monaghan
2
我观察到在8.0.2上,Xcode 6.1 (6A1046a),在iPhone 5(设备,不是模拟器)上,小部件被实例化,loadView、viewDidLayoutSubviews、viewWillAppear和viewDidAppear每次打开通知中心时都会被调用。当滚动小部件时,我看到ViewWillAppear和ViewDidAppear被调用。我还没有观察到widgetPerformUpdateWithCompletionHandler被调用。将通知中心保持打开状态一段时间(大约15分钟),再关闭它(同样,大约15分钟);在我的测试中,这个方法从未被调用过。 - christopherdrum
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接