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。大多數(shù)情況下這個(gè)操作的開銷很小,因?yàn)椴恍枰虞d新的內(nèi)容,但是當(dāng)一個(gè)新的視圖第一次變?yōu)榭梢姇r(shí),它會(huì)突然間加載大量的內(nèi)容,從而導(dǎo)致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"階段可能包含一些開銷比較大的操作,比如讀取文件、從數(shù)據(jù)庫加載數(shù)據(jù)等。并且除此之外,單元格的準(zhǔn)備和顯示、在單元格中布置內(nèi)容、視圖的大小和位置等等,并且這些需要在限定的時(shí)間內(nèi)完成(16 milli-seconds for 60-hertz devices, 8 milli-seconds for 12-hertz iPads, iPad Pro)

iOS 10 中引入了 Pre-Fetching API 來處理這個(gè)問題,通過提前獲取以及背景線程獲取的方式來處理文件的讀取和數(shù)據(jù)庫的加載:

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

但是事實(shí)上這個(gè)導(dǎo)致了一個(gè)意想不到的問題:如果當(dāng)前幀加載的操作不能在相應(yīng)的時(shí)間內(nèi)完成的話 (16 milli-seconds, 8 milli-seconds),下一幀會(huì)同時(shí)開始加載,就會(huì)引起掉幀或者頁面滾動(dòng)故障的現(xiàn)象。這是因?yàn)镃PU事實(shí)上被同時(shí)應(yīng)用于當(dāng)前幀 (Current Frame)以及未來幀 (Future Frame) 的加載,從而導(dǎo)致了CPU資源使用的相互競(jìng)爭(zhēng),以至于兩者事實(shí)上都花費(fèi)了更長(zhǎng)的時(shí)間。

iOS 12 中會(huì)更加智能的安排背景線程的使用,比如變?yōu)榇屑虞d,避免與當(dāng)前線程的產(chǎn)生沖突。

另外一個(gè)意外的問題是:在沒有太多背景線程消耗的情況下也會(huì)產(chǎn)生掉幀。這是因?yàn)閕OS會(huì)在不需要立即需要的時(shí)候停止背景線程的運(yùn)行,這就導(dǎo)致我們需要顯示下一幀的時(shí)候,CPU才會(huì)匆忙的去調(diào)用背景線程加載數(shù)據(jù),這樣導(dǎo)致這個(gè)操作不一定能夠在限定時(shí)間內(nèi)完成從而導(dǎo)致掉幀。

iOS 12 對(duì)此在最底層的CPU控制上進(jìn)行了優(yōu)化,會(huì)更加智能的預(yù)見可能發(fā)生的消耗以及平衡CPU的使用,使得操作能夠在限定時(shí)間內(nèi)完成從而避免掉幀。

而對(duì)于我們開發(fā)而言,這就要求我們:

使用 "Prefetching API" (Table View, Collection View) 提前準(zhǔn)備好數(shù)據(jù)
設(shè)計(jì)上就盡減少單元格所需的加載數(shù)據(jù)以及所需的操作

Performance: Memory

iOS 12 中新引入了 Automatic Backing Store 可以根據(jù)內(nèi)容本身的深度來降低內(nèi)存的使用,比如對(duì)于同樣一張圖片,在高保真("Full Fidelity")和低保真("Lower Fidelity")狀態(tài)下,調(diào)整 BPP (Bits Per Pixel)像素值來減少需要占用的內(nèi)存:

現(xiàn)在ABS已經(jīng)在iOS 12中默認(rèn)開啟,當(dāng)然如果需要的話,也可以自己設(shè)定Backing Store Style:

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

Performance: Auto Layout

iOS 12 中極大提高了 Auto Layout 的性能,視頻列了三個(gè)例子:"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中直接回復(fù)消息:

Grouping 同一個(gè)APP的通知組織在一起:


甚至可以使APP某一類通知放在一起,與其他通知區(qū)別開來。

Settings 更方便的設(shè)置

更多的信息可以參見 "What's New in User Notifications" 和 "Using Grouped Notifications" 演講。

Messages

支持 Presentation Context,讓你知道是在 Message 還是 Media 中;以及 Message 直接內(nèi)嵌到你的APP中,避免APP的切換。

Automatic Passwords and Security Code AutoFIll

支持用戶的APP使用iCloud同步密碼;支持密碼的自動(dòng)填充,包括自動(dòng)讀取2factor的驗(yàn)證代碼;甚至支持根據(jù)特定要求的新密碼的自動(dòng)創(chuàng)建。

Safe Area

更強(qiáng)大的 Safe Area,比如iPad的 Split View,以及更好的適應(yīng)IPhoneX:


Siri Shortcuts

支持自定義的 Siri Shortcuts:


使用此功能可以在APP中自定義功能與短語的對(duì)應(yīng)關(guān)系并加入到Siri Shortcuts中,以便可以在不喚醒APP的情況下,更智能的使用Siri調(diào)用我們APP中相應(yīng)的功能。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 前言 今日頭條iOS技術(shù)團(tuán)隊(duì)負(fù)責(zé)翻譯了今年WWDC的多篇session內(nèi)容,本文由我負(fù)責(zé)翻譯,想要了解更多翻譯內(nèi)容...
    Tamp_閱讀 3,039評(píng)論 9 33
  • 在男神的帶動(dòng)下,拿起了這本書,書皮是條紋的,很有質(zhì)感! 前面兩個(gè)部分,楊絳先生寫我們倆老了,我們仨失散了!三個(gè)人都...
    我是宋小雷閱讀 411評(píng)論 0 1
  • 【雪山行】孤山雪云路難行,橫亙陰崖百丈冰。惟有青青松樹枝,尤記昔日風(fēng)雨情。2017-2-24
    小蘋果兒_閱讀 216評(píng)論 1 1
  • 進(jìn)程 、線程 進(jìn)程作為資源擁有的基本單位,線程作為調(diào)度分配的基本單位基本不擁有資源,只擁有一些必不可少的資源,如:...
    ywhu閱讀 10,063評(píng)論 0 9
  • 我家珍的廚藝有點(diǎn)進(jìn)步, 珍說:本寶寶離做飯的道路越來越遠(yuǎn)。 天說:以后我做飯你洗碗。 珍說:no 。 天說:那我的...
    我愛珍珍閱讀 266評(píng)論 0 0

友情鏈接更多精彩內(nèi)容