【问题标题】:What is the purpose of widgetPerformUpdateWithCompletionHandler in iOS 8 Today Widget?iOS 8 Today Widget中widgetPerformUpdateWithCompletionHandler的作用是什么?
【发布时间】:2014-09-29 21:27:33
【问题描述】:

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

反正就是想知道这个函数的用途是什么:

widgetPerformUpdateWithCompletionHandler

在今天的小部件中。

根据Apple

调用这个方法是为了给一个小部件一个更新它的机会 内容并在快照等操作之前重绘其视图。 当小部件完成更新其内容(和重绘,如果 必要),小部件应调用完成处理程序块, 传递适当的 NCUpdateResult 值。

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


据本网站:http://www.karlmonaghan.com/tag/today-widget/

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

与上述相同的问题。

【问题讨论】:

  • cool 刚刚意识到 karl monaghan 居然发现了这个问题
  • 来自appcoda.com/app-extension-programming-today 系统会拍摄小部件的快照并定期尝试更新它。如果更新成功,该函数使用 NCUpdateResult.NewData 枚举调用系统提供的完成块。如果更新不成功,则使用现有快照。

标签: widget ios8 ios-app-extension


【解决方案1】:

每次查看通知中心时都不会创建小部件,因此不会在每次显示时调用loadView。当通知中心认为小部件信息需要更新时,它会调用widgetPerformUpdateWithCompletionHandler。从我自己的调试来看,当小部件最初创建时,widgetPerformUpdateWithCompletionHandler 几乎是立即被调用的,因此您可以在那里进行所有加载,但 Apple 建议您在生命周期的早期开始加载过程。

如果您的小部件显示的信息从未改变,那么您无需在widgetPerformUpdateWithCompletionHandler 中执行任何操作。

【讨论】:

  • 我应该在 widgetPerformUpdateWithCompletionHandler 之外更新信息吗?从我的调试来看,每次显示小部件时都会调用 loadView ......所以基本上每当调用 widgetPerformUpdateWithCompletionHandler 时,也会调用 loadView 所以在 widgetPerformUpdateWithCompletionHandler 中更新信息真的没有意义。
  • 据我所知,不仅每次显示小部件时都会调用 loadView,而且每次显示小部件时都会完全实例化
  • 截至 2014 年 9 月 5 日,Xcode 6 beta 7 仍然在每次显示视图时触发 awakeFromNib,即使滚动到屏幕外但今天的工作表仍然可见。想知道它实际上是如何工作的。
  • iOS 8.1 测试版的发行说明稍微澄清了一点:widgetPerformUpdateWithCompletionHandler: 的时间表和预期用途:旨在作为所有数据/模型更新逻辑的方便归宿。如果实施,系统将在适当的时候调用小部件以更新其状态,无论是在通知中心可见时还是在后台。需要一个实现来启用后台更新。预计小部件将执行异步更新工作,并尽可能脱离主线程。
  • 我观察到,在 8.0.2、Xcode 6.1 (6A1046a)、iPhone 5(设备,而不是模拟器)上,正在实例化小部件,loadView、viewDidLayoutSubviews、viewWillAppear 和 viewDidAppear 都被调用每次打开通知中心时。滚动小部件时,我看到 ViewWillAppear 和 ViewDidAppear 被调用。我还没有观察到 widgetPerformUpdateWithCompletionHandler 被调用。让通知中心长时间打开(15 分钟左右),让它关闭(再次,15 分钟左右);在这两种情况下,我的测试都不会调用此方法。
猜你喜欢
  • 2014-11-13
  • 1970-01-01
  • 2014-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-29
相关资源
最近更新 更多