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è)操作的開(kāi)銷很小,因?yàn)椴恍枰虞d新的內(nèi)容熙卡,但是當(dāng)一個(gè)新的視圖第一次變?yōu)榭梢?jiàn)時(shí)杖刷,它會(huì)突然間加載大量的內(nèi)容,從而導(dǎo)致CPU突然間的峰值使用:

Expensive Frame

下面使用 UI Table View 來(lái)解釋這種開(kāi)銷突然變大的原因:

// 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"階段可能包含一些開(kāi)銷比較大的操作驳癌,比如讀取文件滑燃、從數(shù)據(jù)庫(kù)加載數(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 來(lái)處理這個(gè)問(wèn)題乐严,通過(guò)提前獲取以及背景線程獲取的方式來(lái)處理文件的讀取和數(shù)據(jù)庫(kù)的加載:

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

但是事實(shí)上這個(gè)導(dǎo)致了一個(gè)意想不到的問(wèn)題:如果當(dāng)前幀加載的操作不能在相應(yīng)的時(shí)間內(nèi)完成的話 (16 milli-seconds, 8 milli-seconds),下一幀會(huì)同時(shí)開(kāi)始加載衣摩,就會(huì)引起掉幀或者頁(yè)面滾動(dòng)故障的現(xiàn)象昂验。這是因?yàn)镃PU事實(shí)上被同時(shí)應(yīng)用于當(dāng)前幀 (Current Frame)以及未來(lái)幀 (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è)意外的問(wèn)題是:在沒(méi)有太多背景線程消耗的情況下也會(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ù)見(jiàn)可能發(fā)生的消耗以及平衡CPU的使用,使得操作能夠在限定時(shí)間內(nèi)完成從而避免掉幀莱褒。

而對(duì)于我們開(kāi)發(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)容本身的深度來(lái)降低內(nèi)存的使用,比如對(duì)于同樣一張圖片,在高保真("Full Fidelity")和低保真("Lower Fidelity")狀態(tài)下阅茶,調(diào)整 BPP (Bits Per Pixel)像素值來(lái)減少需要占用的內(nèi)存:

現(xiàn)在ABS已經(jīng)在iOS 12中默認(rèn)開(kāi)啟蛛枚,當(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",具體參見(jiàn) "Data You Can Trust"演講撞蜂。

API Enhancements

Notifications

Interaction 在Notification中直接回復(fù)消息:

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


甚至可以使APP某一類通知放在一起盲镶,與其他通知區(qū)別開(kāi)來(lái)。

Settings 更方便的設(shè)置

更多的信息可以參見(jiàn) "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中自定義功能與短語(yǔ)的對(duì)應(yīng)關(guān)系并加入到Siri Shortcuts中裳擎,以便可以在不喚醒APP的情況下涎永,更智能的使用Siri調(diào)用我們APP中相應(yīng)的功能。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末鹿响,一起剝皮案震驚了整個(gè)濱河市羡微,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌惶我,老刑警劉巖妈倔,帶你破解...
    沈念sama閱讀 216,324評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異绸贡,居然都是意外死亡盯蝴,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門听怕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)捧挺,“玉大人,你說(shuō)我怎么就攤上這事尿瞭∶隼樱” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,328評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵声搁,是天一觀的道長(zhǎng)黑竞。 經(jīng)常有香客問(wèn)我捕发,道長(zhǎng),這世上最難降的妖魔是什么摊溶? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,147評(píng)論 1 292
  • 正文 為了忘掉前任爬骤,我火速辦了婚禮,結(jié)果婚禮上莫换,老公的妹妹穿的比我還像新娘霞玄。我一直安慰自己,他們只是感情好拉岁,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,160評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布坷剧。 她就那樣靜靜地躺著,像睡著了一般喊暖。 火紅的嫁衣襯著肌膚如雪惫企。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,115評(píng)論 1 296
  • 那天陵叽,我揣著相機(jī)與錄音狞尔,去河邊找鬼。 笑死巩掺,一個(gè)胖子當(dāng)著我的面吹牛偏序,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播胖替,決...
    沈念sama閱讀 40,025評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼研儒,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了独令?” 一聲冷哼從身側(cè)響起端朵,我...
    開(kāi)封第一講書(shū)人閱讀 38,867評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎燃箭,沒(méi)想到半個(gè)月后冲呢,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,307評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡招狸,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,528評(píng)論 2 332
  • 正文 我和宋清朗相戀三年碗硬,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瓢颅。...
    茶點(diǎn)故事閱讀 39,688評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡恩尾,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出挽懦,到底是詐尸還是另有隱情翰意,我是刑警寧澤,帶...
    沈念sama閱讀 35,409評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站冀偶,受9級(jí)特大地震影響醒第,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜进鸠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,001評(píng)論 3 325
  • 文/蒙蒙 一稠曼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧客年,春花似錦霞幅、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,657評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至绍傲,卻和暖如春扔傅,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背烫饼。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,811評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工猎塞, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人杠纵。 一個(gè)月前我還...
    沈念sama閱讀 47,685評(píng)論 2 368
  • 正文 我出身青樓荠耽,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親淡诗。 傳聞我的和親對(duì)象是個(gè)殘疾皇子骇塘,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,573評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容