iOS14小组件(Widget)实战二

2,390 阅读2分钟

iOS14小组件(Widget)实战二

前言

前面第一节已经简单描述了小组件的基本创建,按照图片步骤一步步来应该很简单,这一节我们一起来探索一下小组件里边到底做了什么事情。

小组件内部函数

小组件的入口

  1. 选中MyWidget.swift文件,找到@main函数! 45019519-837B-4F53-BAD7-9D4614DD23CA.jpeg 这里就是整个小组件的入口了,记住一点,小组件有且只有一个@main入口,这里是单一小组件的方式,后续章节会讲解多个小组件如何创建。现在我们看看这个main函数做了什么 EBCC05D9-A75F-4C09-8F66-51905272963B.jpeg
  • @main:代表着Widget的主入口,系统从这里加载
  • kind:是Widget的唯一标识
  • IntentConfiguration:初始化配置代码
  • configurationDisplayName:添加编辑界面展示的标题
  • description:添加编辑界面展示的描述内容
  • supportedFamilies这里可以限制要提供小、中、大三个样式中的哪几个 B068F1B9-13FF-49A2-97E8-4D8E360A9FC1_4_5005_c.jpeg configurationDisplayName、description、supportedFamilies说明一下是在添加小组件页面进行展示的

1CC0A25E-3946-467E-828A-8248C5A6841E_4_5005_c.jpeg

Provider做了什么

图像2021-4-7 下午1.40 (3).jpeg Provider:为小组件展示提供一切必要信息的结构体,实现TimelineProvider协议 placeholder:提供一个默认的视图,当网络数据请求失败或者其他一些异常的时候,用于展示 getSnapshot:为了在小部件库中显示小部件,WidgetKit要求提供者提供预览快照,在组件的添加页面可以看到效果 getTimeline:在这个方法内可以进行网络请求,拿到的数据保存在对应的entry中,调用 completion之后会到刷新小组件,图片只展示了系统for循环创建的假数据。 Timeline 刷新的时机包括以下几种:

  1. atEnd
  2. after(date)
  3. never
  • atEnd 这个就是在 TimelineProvider 提供的所有 entry 显示完毕之后自动刷新,也就是说只要还有没有显示的 entry 在就不会刷新当前时间线
  • after(date)date 这个参数可以是某一个特定时间值,在系统时间到达那一时刻后会使 Timeline 自动刷新
  • never这个就是字面意思,永远不会刷新 Timeline,最后一个 entry 也展示完毕之后 Widget 就会一直保持那个 entry 的显示内容 这里要注意的是 Timeline Reload 的时机是由系统统一控制的,而为了保证性能,系统会根据各个 Reload 请求的重要等级来决定在某一时刻是否按照 APP 要求的刷新时机来刷新 Timeline。因此如果过于频繁的请求刷新 Timeline,很有可能会被系统限制从而不能达到理想的刷新效果。换句话说,上面所说的 atEnd, after(date) 中定义的刷新 Timeline 的时机可以看作刷新 Timeline 的最早时间,而根据系统的安排,这些时机可能会被延后。

页面展示

图像2021-4-7 下午1.40 (4).jpeg