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突然間的峰值使用:
下面使用 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)的功能。