WWDC2018 session 202

What’s New in Cocoa Touch

该文档主要是了解下Cocoa Touch的一些新特性。主要包括三部分,Framework updates、API enhancements、Siri shortcuts,下面针对这三部分逐一介绍。

Framework Updates

Framework Updates部分主要是针对性能做了一些优化,包括滑动时的性能、内存优化、自动布局性能等。

Scrolling

在iOS开发中,scrolling是经常涉及到的操作。无论是UITableView、UICollectionView,还是UIScrollView,用户在使用时,最多的操作就是scrolling。以UITableView为例,通常情况下cell都是有重用机制的,因此在滑动时耗费的性能不多,但是某些复杂的cell第一次出现时,性能会突然上升,当然,划过该cell之后,性能会重新回到一个较低的水平。这里视频中给出了一张图可以看一下:

这里写图片描述

下面来分析下为何cell第一次出现时消耗的性能会上升。

UITableViewCell创建的过程在UITableViewDataSource的tableView:cellForRowAtIndexPath方法中。通常情况下,创建并显示一个cell的流程如下:
1. Dequeue or allocate cell(创建cell)
2. Populate cell with model data(使用数据模型来填充该cell,这一步所花费的时间取决于具体的应用程序。比如说这一步中涉及到了读文件,读数据库等操作,那么这一步是比较耗时的)
3. call layoutSubviews on UIViews in the cell(数据模型和cell绑定后,需要确定cell中的subview的布局、位置等信息,此时会调用layoutSubviews方法。这一步所花费的时间有可能是比较久的,因为可能会包含一些费时的操作,如布局文字等)
4. call draw() on UIViews in the cell(将cell显示到屏幕上,这一步也有可能花费较多的时间,比如说绘制文字所花费的时间就比较长)

需要注意的是,上述的4步操作需要在非常短的时间内完成。以iPhone来说,iPhone屏幕每秒钟要刷新60次,因此上述操作需要在16.6ms内完成,否则就有丢帧的现象。在iOS10中,苹果提供了预获取数据模型的API,主要是针对 Populate cell with model data。预获取数据会提前得到数据模型,且该操作发生在子线程,不会阻塞主线程。该API是在UITableViewDataSourcePrefetching协议中,该协议提供了两个方法:

// this protocol can provide information about cells before they are displayed on screen.

@protocol UITableViewDataSourcePrefetching <NSObject>

@required

// indexPaths are ordered ascending by geometric distance from the table view
- (void)tableView:(UITableView *)tableView prefetchRowsAtIndexPaths:(NSArray<NSIndexPath *> *)indexPaths;

@optional

// indexPaths that previously were considered as candidates for pre-fetching, but were not actually used; may be a subset of the previous call to -tableView:prefetchRowsAtIndexPaths:
- (void)tableView:(UITableView *)tableView cancelPrefetchingForRowsAtIndexPaths:(NSArray<NSIndexPath *> *)indexPaths;

@end

开发者只需要实现第一个方法就可以了。在该方法中可以写一些耗时的操作,比如读文件、读数据库等。这样在cell显示之前数据已经准备好了,可以降低一些CPU的消耗。

虽然已经有了预获取数据模型的方法,然而苹果在测试scrolling时,发现某些情况下仍旧有丢帧的现象,为什么呢?苹果在分析该问题时,发现和上面提到的prefetching data有关。看一下下面这张图:

这里写图片描述

虽然prefetch是在子线程执行,但是prefetch和上面提到的4步操作有可能是同时在执行,这就加重了CPU的负担,有可能造成丢帧。Prefetching Data获取的是未来要显示的数据,但是该操作影响到了当前正在显示的cell,这样显然是不太合理的。得益于更加智能的判断,iOS12中针对这种情况进行了优化,优先处理当前正在显示的cell的任务,显示完cell之后在去执行prefetch操作。如下图:
这里写图片描述
在处理完这种情况后,苹果在测试scrolling时发现另外一种情况也有可能导致丢帧现象。苹果发现,在没有后台任务运行时,前台我们自己的app所滑动时的cell也是比较简单的,然而某些情形下也会丢帧。为了查清楚原因,苹果针对CPU的行为进行了研究。先看一张图:
这里写图片描述
这种情况下,没有后台任务,所做的操作就是在前台scrolling,此时CPU的性能也维持在一个较低的状态。这是比较合理的,因为在没有复杂任务时,CPU维持在一个低性能,所消耗的电量更少。然而,当滑动到一个复杂的cell,需要较高的CPU性能时,CPU从低性能切换到高性能所花费的时间较久。从创建cell到显示cell只有16ms的时间,等CPU从低性能切换到高性能,已经太晚了,这种情况下就造成了丢帧。iOS12中针对这种情况进行了优化,可以在较短的时间内将CPU从低性能切换到高性能,如图:
这里写图片描述
上面所提到的这两个优化iOS12中已经自带了,开发者不需要做额外的工作。对于还没有应用perfetch的应用,苹果建议尽早使用该api,因为能够提升滑动的流畅度。

Memory

内存对app的性能是有影响的。app使用的内存越多,内存对app性能的影响就越大。通常情况下,手机的内存更多的是被系统本身以及其他的应用程序所占用,我们自己的app只使用了小部分内存。某些时候,当我们的app需要更多的内存,而剩余的内存不足以满足我们app的需求时,这种情况下就需要考虑内存对app性能的影响了。发生这种情况时,cpu为了满足前台app的需求,需要处理一些后台的app,比如将某些后台app杀死以释放足够的内存,来满足前台的app,这些操作都是消耗时间的,可能会影响到我们app的性能。为了避免这种情况,降低内存的使用是比较合理的。该视频中介绍了iOS 12中的一个新技术 - Automatic Backing Store,来降低内存的使用。

由于该技术的应用场景比较局限,这里只是简单的介绍一下。该技术的本质是在保证色彩不失真的基础上,用更少的数据量,去表达一个点的颜色。先看一张图:
这里写图片描述
375 * 250的两张图,所占用的内存都是2.2M,但是明显右侧的图所表示的信息更少(只有黑白两种颜色)。针对这种情况,苹果使用了新技术,也就是Automatic Backing Store,该技术针对右侧的图片,使用8位来表示颜色,这样两张图片所占用的内存对比就变成了下图:
这里写图片描述
这是一个非常大的提升。

Auto Layout

iOS 12针对Auto Layout的性能进行了优化,主要体现在三方面。
1. 当多个view相互独立,互不依赖时,Auto Layout所消耗的性能随着view的增加而线性增加。iOS 12中,降低了性能增加的速度,如图:
这里写图片描述
虽然都是线性增加,但是iOS 12增加的更慢。
2. 当多个view之间有关联,布局相互依赖时,Auto Layout所消耗的性能随着view的增加而指数增加。iOS 12针对这种情况进行了优化,多个view互相依赖时,Auto Layout所消耗的性能随着view的增加线性增加,如图:
这里写图片描述
3. 当多个view相互嵌套时,Auto Layout所消耗的性能随着view的增加而指数增加。iOS 12针对这种情况进行了优化,多个view嵌套,Auto Layout所消耗的性能随着view的增加而线性增加,如图:
这里写图片描述

API enhancements

这一部分主要介绍了iOS 12中一些API的改进,主要包括Notification、Messages、Automatic Passwords and Security Code AutoFill、Safe Area四部分。

Notification

iOS 12中Notification做了较大的改进,该视频中介绍了三项。

Interaction

在iOS 12中,开发者可以自定义Notification的界面和交互。

Grouping

在iOS 12中,来自于同一个app的通知会被分到同一组中,当然,开发者也可以自定义如何分组。

Settings

在iOS 12中,可以在通知界面直接选择是否关闭该app的通知,也可以选择是否关闭所有通知,不用再到设置app中操作。

Messages

Messages上的改进主要体现在两处:相机可以使用iMessage贴纸以及水平滑动时的交互。

在iOS 12中,在Message中拍照时可以将贴纸加到相机中,苹果提供了新的api。

另外,在Message中横滑操作默认是切换app,在iOS12中可以接收这个事件,自定义横滑的操作。

Automatic Passwords and Security Code AutoFill

在iOS 11中,已经引入了自动帮用户填密码的功能,前提是密码保存在iCloud Keychain,在iOS 12中,更加完善了该功能。

iOS 12中,除了登录时提示将密码保存在iCloud Keychain,在用户修改密码时,开发者也可以控制弹该提示。除此之外,iOS 12还能够帮助用户自动生成密码,如果app对密码有要求,比如说密码长度,密码的字符,这些开发者也可以设置,保证自动生成的密码是满足要求的。另外,iOS 12针对输入验证码这一步进行了优化,能够自动的获取到验证码并显示到屏幕上,避免了用户切到Message的操作。

Safe Area

Safe Area这一部分没有太多的内容,主要是介绍了Safe Area的重要性,以及建议开发者尽早的使用Safe Area来开发。

Siri Shortcuts

这一部分主要是介绍了如何是我们自己的app来响应Siri。苹果提供了两个API供我们自己的app来响应Siri。

NSUserActivity

NSUserActivity可以理解成一个Common Api,使用非常简单:

Set eligibleForPrediction = true

Intents

如果有更多自定义的需求,那么需要使用Intents,可以使用 Siri Kit Intents API,在iOS 12中也可以自定义Intents。

关于Siri Shortcuts视频中只是简单的介绍了一下,更多的内容可以参考其他的session:

Session 211 - Introduction to Siri Shortcuts

Session 214 - Building for Voice with Siri Shortcuts

总结

以上就是WWDC 2018 session 202的一些总结。由于现在还没有中文翻译,因此文档中的内容是看英文加自己的理解整理而来的,有理解不正确的地方,欢迎大家指教。

发布了71 篇原创文章 · 获赞 34 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/TuGeLe/article/details/82593333
今日推荐