WWDC 2018 What's New in Cocoa Touch

Framework Updates

Performance: Scrolling

iOS中的Scrolling基本遵循同样的模式:We load content to be displayed into the views and then we're just moving that content around。大多数情况下这个操作的开销很小,因为不需要加载新的内容,但是当一个新的视图第一次变为可见时,它会突然间加载大量的内容,从而导致CPU突然间的峰值使用:

Expensive Frame

下面使用 UI Table View 来解释这种开销突然变大的原因:

// UITableView Cell Load Cost
import UIKit
class MyTableViewDataSource {
    func tableView(_ tableView: UITableView,
                   cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        // Dequeue or allocate cell
        // Populate cell with model data
        return myCell
    }
}
// call layoutSubviews on UIViews in the cell
// call draw() on UIViews in the cell

在 "Populate cell with model data"阶段可能包含一些开销比较大的操作,比如读取文件、从数据库加载数据等。并且除此之外,单元格的准备和显示、在单元格中布置内容、视图的大小和位置等等,并且这些需要在限定的时间内完成(16 milli-seconds for 60-hertz devices, 8 milli-seconds for 12-hertz iPads, iPad Pro)

iOS 10 中引入了 Pre-Fetching API 来处理这个问题,通过提前获取以及背景线程获取的方式来处理文件的读取和数据库的加载:

// UITableView Pre-Fetching
protocol UITableViewDataSourcePrefetching {
    func tableView(_ tableView: UITableView, prefetchRowsAt indexPaths: [IndexPath])
    func tableView(_ tableView: UITableView,
                   cancelPrefetchingForRowsAt: indexPaths [IndexPath])
}

但是事实上这个导致了一个意想不到的问题:如果当前帧加载的操作不能在相应的时间内完成的话 (16 milli-seconds, 8 milli-seconds),下一帧会同时开始加载,就会引起掉帧或者页面滚动故障的现象。这是因为CPU事实上被同时应用于当前帧 (Current Frame)以及未来帧 (Future Frame) 的加载,从而导致了CPU资源使用的相互竞争,以至于两者事实上都花费了更长的时间。

iOS 12 中会更加智能的安排背景线程的使用,比如变为串行加载,避免与当前线程的产生冲突。

另外一个意外的问题是:在没有太多背景线程消耗的情况下也会产生掉帧。这是因为iOS会在不需要立即需要的时候停止背景线程的运行,这就导致我们需要显示下一帧的时候,CPU才会匆忙的去调用背景线程加载数据,这样导致这个操作不一定能够在限定时间内完成从而导致掉帧。

iOS 12 对此在最底层的CPU控制上进行了优化,会更加智能的预见可能发生的消耗以及平衡CPU的使用,使得操作能够在限定时间内完成从而避免掉帧。

而对于我们开发而言,这就要求我们:

使用 "Prefetching API" (Table View, Collection View) 提前准备好数据
设计上就尽减少单元格所需的加载数据以及所需的操作

Performance: Memory

iOS 12 中新引入了 Automatic Backing Store 可以根据内容本身的深度来降低内存的使用,比如对于同样一张图片,在高保真("Full Fidelity")和低保真("Lower Fidelity")状态下,调整 BPP (Bits Per Pixel)像素值来减少需要占用的内存:

现在ABS已经在iOS 12中默认开启,当然如果需要的话,也可以自己设定Backing Store Style:

Automatic is now default
• UIView.draw()
• UIGraphicsImageRenderer
• UIGraphicsImageRendererFormat.Range

Performance: Auto Layout

iOS 12 中极大提高了 Auto Layout 的性能,视频列了三个例子:"Independent Sibling View", "Dependent Sibling Views" 以及 "Nested Views"。

Framework Updates: Swiftification

Swift 4.2 支持了 4.0中不支持的嵌套方式:

Nested Types

// Swift 4
enum UITabBarItemPositioning {
    case automatic
    case fill
    case centered
}
    
// Swift 4.2
class UITabBar : UIView {
    enum ItemPositioning {
        case automatic
        case fill
        case centered
    }
}

Nested Constants

// Swift 4
class NSNotification : NSObject {
    struct Name {
        class let didChangeStatusBarOrientation: NSNotification.Name
    }
}

let UIApplicationStatusBarOrientationUserInfoKey: String

// Swift 4.2
class UIApplication : UIResponder {
    class let didChangeStatusBarOrientationNotification: NSNotification.Name
    class let statusBarOrientationUserInfoKey: String
}

Nested Functions

let insets = UIEdgeInsets(top: 8, left: 0, bottom: 8, right: 0)
let image = UIImage(named: “Apple”)

// Swift 4
let insetRect = UIEdgeInsetsInsetRect(originalRect, insets)
let pngData = UIImagePNGRepresentation(image)

// Swift 4.2
let insetRect = originalRect.insetBy(insets)
let pngData = image.pngData()

Framework Updates: NSSecureCoding

引入了新的 "secure-by-default encoding and decoding APIs",具体参见 "Data You Can Trust"演讲。

API Enhancements

Notifications

Interaction 在Notification中直接回复消息:

Grouping 同一个APP的通知组织在一起:


甚至可以使APP某一类通知放在一起,与其他通知区别开来。

Settings 更方便的设置

更多的信息可以参见 "What's New in User Notifications" 和 "Using Grouped Notifications" 演讲。

Messages

支持 Presentation Context,让你知道是在 Message 还是 Media 中;以及 Message 直接内嵌到你的APP中,避免APP的切换。

Automatic Passwords and Security Code AutoFIll

支持用户的APP使用iCloud同步密码;支持密码的自动填充,包括自动读取2factor的验证代码;甚至支持根据特定要求的新密码的自动创建。

Safe Area

更强大的 Safe Area,比如iPad的 Split View,以及更好的适应IPhoneX:


Siri Shortcuts

支持自定义的 Siri Shortcuts:


使用此功能可以在APP中自定义功能与短语的对应关系并加入到Siri Shortcuts中,以便可以在不唤醒APP的情况下,更智能的使用Siri调用我们APP中相应的功能。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,029评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,395评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,570评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,535评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,650评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,850评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,006评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,747评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,207评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,536评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,683评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,342评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,964评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,772评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,004评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,401评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,566评论 2 349

推荐阅读更多精彩内容