前言
今日頭條iOS技術團隊負責翻譯了今年WWDC的多篇session內容征绸,本文由我負責翻譯蚜迅,想要了解更多翻譯內容請看今日頭條技術團隊博客[ WWDC2018 ] - 來自一線開發(fā)者的技術筆記
鸯绿。
正文
這篇文章是對WWDC2018關于Cocoa Touch新特性的翻譯與總結。在What's New in Cocoa Touch這個session中椭岩,主要分為三個topic來講的,下面一個一個來看言缤。
一、Framework updates
一禁灼、性能優(yōu)化方面
1管挟、scrolling
在iOS12中首先對scrollview的滑動做了預加載數據和CPU計算優(yōu)化。主要以UITableview的加載來進行了舉例弄捕。UITableview在顯示的時候分為這幾步僻孝。
- 先從緩存隊列中取出一個cell或者是直接創(chuàng)建一個cell
- 將model數據傳入cell,而這一步具體的消耗如何就要看數據的獲取方式了守谓,你可能從數據庫中獲取穿铆,也可能從網絡中獲取,總之這可能是一個相當耗時的工作斋荞。
- cell調用layoutSubviews為子視圖布局
- 調用draw()方法繪制view荞雏,也就是drawInRect方法進行繪制。這里cell所有的子view都要調用一遍,我們還可能填充文字等凤优,所以這一步也可能需要較大的時間開銷
在這種cell的展示方式中悦陋,這四步都必須要在cell展示的那一幀時間內(1/60秒)完成,才能保證不卡頓筑辨。為了讓cell計算的速度盡可能快俺驶,所以在iOS12中有了prefetch API,這個API可以提前異步的去進行數據的獲取棍辕,所以在滑動的時候繪制Cell那一幀時間里就省去了數據獲取的步驟暮现,只負責cell的繪制就夠了,這樣就大大節(jié)省了CPU的開銷楚昭。
在UITableViewDataSourcePrefetching
這個protocol中送矩,也就兩個方法:
protocol UITableViewDataSourcePrefetching {
func tableView(_ tableView: UITableView, prefetchRowsAt indexPaths: [IndexPath])
func tableView(_ tableView: UITableView, cancelPrefetchingForRowsAt: indexPaths [IndexPath])
}
這兩個方法中必須實現的就是prefetchRowAt
這個方法,你可以把一些耗時的數據獲取工作放在這個方法中哪替。這樣就可以在cell顯示之前提前獲取數據而不用等到cell繪制的時候另外占用CPU開銷。
后面發(fā)現了一個case菇怀。如果在cell load過程中同時進行prefetch凭舶,就會造成在繪制當前cell的時候既要load當前cell,還要去prefetch下一個即將顯示的cell爱沟,這樣就會造成繪制當前cell的時候CPU開銷太大帅霜。
所以在后面有了改進,如下圖所示呼伸,它是在當前cell load完成的時候去異步prefetch下一個cell的數據的身冀。這樣就避免prefetch對當前cell繪制的影響。
另外還發(fā)現了一個case括享,如果在設備并沒有滿載的時候搂根,這個時候只是運行了一個簡單的前臺程序的滑動工作,CPU并不知道將來的工作到底如何铃辖,它可能就會使用盡可能低的level進行工作以進行省電剩愧。但是這個時候如果來了復雜的計算(需要繪制復雜的cell),等CPU提高level再去進行計算娇斩,可能就會太遲了仁卷,就很容易造成卡頓。這個時候CPU的工作方式如圖:
因此在iOS12中犬第,會提前把要繪制的信息告訴CPU锦积,如果有復雜的任務,CPU就會提前進入高的level歉嗓,這樣提前了解App需要的CPU占用情況丰介,就能讓CPU及時改變它的level。所以在iOS12中CPU會盡可能的根據你的應用的需求情況來進行調整,這樣在達到了省電的同時還能充分利用CPU保證流暢性基矮,確實很棒淆储!
2、Memory
首先強調了一下memory對性能影響的重要性家浇,然后介紹了一下App在運行的時候本砰,內存的使用情況
當你請求一個小的內存的時候,此時內存足夠钢悲,就會直接獲取free memory点额,但是現在當你的App申請一個較大的內存的時候,這個時候就很可能內存不足莺琳,系統(tǒng)就會從Other Apps and System中去獲取还棱,也就是其它那些在后臺中的進程。雖然這能滿足我們的需求惭等,但它仍然可能在其它地方產生未知的影響珍手。而且這個過程對于我們的App來說依然會占用很多時間,所以其實對我們的應用也是有影響的辞做。因此找到一些方法來節(jié)約內存對于我們的App來說會有很大的提升琳要。下面就講到了iOS12中對圖片的一個優(yōu)化。
以上面兩個圖來說秤茅,他們的內存大小都是每個像素64位這樣來計算的稚补。但其實第二張圖并沒有完全利用所有的color位數,因為它只有黑白兩種顏色,顯然這造成了對內存的浪費。所以在iOS12中只使用了8位纺涤,所以第二種圖片在使用了Automstic Backing Store后的內存占用縮減成了下面這樣,這對于App的內存占用是一個很大的提高乍惊。
Automstic Backing Store在iOS12的SDK中默認會在下面這三種方法中進行
- UIView.draw()
- UIGraphicsImageRenderer
- UIGraphicsImageRenderFormat.Range
所有與圖片渲染相關的API都可以使用Automstic Backing Store,如果想要了解詳細使用情況的話放仗,可以看這個session(Image and Graphics Best Practices
)
3污桦、autolayout
Autolayout在iOS12中也進行了較大的提升。
首先是對于互不相關的兄弟視圖來說匙监,雖然在iOS12之前隨著視圖的增多計算的復雜度就已經是線性增加的了凡橱,但是iOS12中通過團隊的努力還是把計算復雜度盡其所能的進行了降低。
然后再說更加復雜的約束相互有依賴的視圖亭姥,iOS12之前隨著視圖的增多稼钩,frame的計算復雜度是在呈指數上漲的。所以之前使用autolayout的話性能瓶頸是很明顯的达罗,稍微復雜一點的視圖我們可能都會放棄autolayout坝撑。但是在iOS12中静秆,autolayout的計算不再呈指數上漲了。通過優(yōu)化也已經實現線性增加的復雜度巡李。對于嵌套視圖來說抚笔,也是如此,復雜度由指數級下降至線性級侨拦。
這樣一來殊橙,iOS12以后使用autolayout我們也不用太擔心性能瓶頸問題了,這確實是一件值得興奮的事狱从。更多相關內容膨蛮,可以查看這篇session(High Performance Auto Layout
)
二、Swiftification
主要講了swift有以下幾點增強季研,總結一下就是讓swift感覺更加swift了敞葛。
- Types
主要就是一些全局type加入到了類中,讓我們使用起來更加方便与涡。下面給了一些例子:
// Swift 4
enum UIApplicationState {
case active
case inactive
case background
}
// Swift 4.2
class UIApplication : UIResponder {
enum State {
case active
case inactive
case background
}
}
// Swift 4
enum UITabBarItemPositioning {
case automatic
case fill
case centered
}
// Swift 4.2
class UITabBar : UIView {
enum ItemPositioning {
case automatic
case fill
case centered
}
}
- 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
}
// Swift 4
let UIFloatRangeZero: UIFloatRange
let UIFloatRangeInfinite: UIFloatRange
// Swift 4.2
struct UIFloatRange {
static let zero: UIFloatRange
static let infinite: UIFloatRange
}
- Fundations
還有一些全局函數也被移進了相關類中,如下一些例子:
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()
// Swift 4
NSStringFrom[CGPoint, CGRect, CGSize, CGVector, CGAffineTransform, UIEdgeInsets, UIOffset]
[CGPoint, CGRect, CGSize, CGVector, CGAffineTransform, UIEdgeInsets, UIOffset]FromString
// Swift 4.2 – Codable Conformance
let encoded = JSONEncoder().encode(CGPoint(x: 0, y: 0))
let decoded = JSONDecoder().decode(CGPoint.self, from: encoded)
// Swift 4
NSStringFrom[CGPoint, CGRect, CGSize, CGVector, CGAffineTransform, UIEdgeInsets, UIOffset]
[CGPoint, CGRect, CGSize, CGVector, CGAffineTransform, UIEdgeInsets, UIOffset]FromString
// Swift 4.2 — Codable Conformance
let encoded = JSONEncoder().encode(CGPoint(x: 0, y: 0))
let decoded = JSONDecoder().decode(CGPoint.self, from: encoded)
// Swift 4.2 — Debug Printing
print(CGPoint(x: 0, y: 0))
print(“Offset: \(UIOffset(horizontal: 10, vertical: 10))”)
// Swift 4
NSStringFrom[CGPoint, CGRect, CGSize, CGVector, CGAffineTransform, UIEdgeInsets, UIOffset]
[CGPoint, CGRect, CGSize, CGVector, CGAffineTransform, UIEdgeInsets, UIOffset]FromString
// Swift 4.2 — Codable Conformance
let encoded = JSONEncoder().encode(CGPoint(x: 0, y: 0))
let decoded = JSONDecoder().decode(CGPoint.self, from: encoded)
// Swift 4.2 — Debug Printing
print(CGPoint(x: 0, y: 0))
print(“Offset: \(UIOffset(horizontal: 10, vertical: 10))”)
// Swift 4.2 — Legacy Encoding/Decoding
let encoded = NSCoder.string(for: CGPoint(x: 0, y: 0))
let decoded = NSCoder.cgPoint(for: encoded)
另外還增加了安全的編解碼API驼卖,但是這里并沒有詳細介紹氨肌,如果想要了解的話可以看這篇session(Data You Can Trust
)
二、API enhancements
1款慨、NOtifications
在iOS12中通知有了很多很大的提升,但是今天只講以下三個方面谬莹。
- interaction
iOS12在通知中可以有更多的交互檩奠,現在的交互動作也不再是靜態(tài)的,比如iMessage甚至可以直接回復信息
- Grouping
iOS中的notification已經默認支持分組附帽,也就是說默認情況下一個應用的通知都會被分為一個group進行展示埠戳。當然你也可以進行個人定制,可以通過給通知標記thread identifier蕉扮,這樣所有有相同的thread identifier的通知都會出現在同一個group整胃。
- settings
iOS12新的的通知UI增加了Notification settings。Notification settings支持用戶根據他們自己的行為定制個性化的通知喳钟,或者
你也可以通過iOS12中一個新的API來為用戶深入定制與你應用相關的setting屁使。
更多與Notification相關的內容可以查看這兩個sessionWhat’s New in User Notifications
和Using Grouped Notifications
2、Messages
在iOS12中iMessage增加了camera中的一些新特性奔则,只要我們在xcode中創(chuàng)建sticker template蛮寂,我們創(chuàng)建的貼紙就會自動加入messages和相機中。除此之外易茬,如果你想創(chuàng)建更加定制化的貼紙的話酬蹋,你可以使用MSMessages App ViewController
及老,并在info.plist中配置如下參數
<key>MSSupportedPresentationContexts</key>
<array>
<string>MSMessagesAppPresentationContextMessages</string>
<string> MSMessagesAppPresentationContextMedia</string>
</array>
這兩個參數讓你的貼紙既可以在messages中使用,也可以在相機中使用范抓,當然你也可以選擇某一個骄恶。
你可以通過以下新的API判斷你的messages app是處于messages中還是相機中。
enum MSMessagesAppPresentationContext : UInt {
case messages
case media
}
還有一個小改動就是之前左右滑動會進行messages app的切換匕垫,現在左右滑動的手勢不會產生切換了僧鲁,也就是說你的messages app支持左右滑動了。(這個對比一個iOS11和iOS12的iMessage就可以看到)
3年缎、Automatic Passwords and Security Code AutoFill
在iOS12中悔捶,你只需要將你的登錄輸入框設置為password text content type或者將注冊輸入框(密碼修改輸入框)設置為new password text content type,系統(tǒng)就會自動識別单芜,提示用戶將密碼存入iCloud的keychain中蜕该,并且在用戶下次輸入的時候自動填充密碼。
另外在短信驗證中洲鸠,獲取驗證碼后也就不用來回切換app了堂淡,系統(tǒng)會自動識別驗證碼。
總之扒腕,在strong passwords的使用下绢淀,我們再也不用為各種各樣的密碼和驗證碼而煩惱啦。更多詳細內容可以看這篇sessionAutomatic Strong Passwords and Security Code AutoFill
4瘾腰、safeArea
safeArea可以確保我們的內容不會超出內容正確顯示范圍皆的,比如一些top bar,bottom bar啥的蹋盆。safeArea的計算其實是非常復雜的费薄,它會根據不同的設備進行不同的比例縮放∑芪恚總之它給了我們一個安全的區(qū)域讓我們去填充我們的視圖楞抡。
safeArea其實不是什么新內容,不過這里再次強調可以看出蘋果對safeArea的重視析藕,而且蘋果官方很鼓勵我們去使用safeArea召廷,所以我們以后自定義視圖的時候一定要注意根據safeArea去布局,不要超出safeArea的范圍账胧。
最后有一個相關的session推薦UIKit: Apps for Every Size and Shape
三竞慢、Siri shortcuts
iOS12中新增的主要有兩個API,這兩個API讓你不僅可以與Siri有一些常見的簡單的互動治泥,還可以在一些復雜的場景中有一些更加定制化的互動梗顺。
1、NSUserActivity
NSUserActivity是一個簡單的API车摄,它可以被用于簡單的切換和喚起寺谤。雖然簡單仑鸥,但是在一些場景中它也可以發(fā)揮巨大的作用,比如你可以通過它返回到應用中的某一指定頁面变屁。比如你正在看某一條信息或者文件的時候眼俊,可以通過它在另一個設備跳轉到相同的位置。而是用起來也很簡單粟关,只需要一行代碼搞定
Set eligibleForPrediction = true
2疮胖、SiriKit
如果你想使用更多定制化的內容的話,就可以使用它了闷板。它包含的內容很多澎灸,如圖所示:
這些是一些去年都已經有的內容,在iOS12中遮晚,你可以定義自己的內容性昭。
這里也只是簡單的介紹了一下,想要詳細了解的話這里推薦了三篇session
Siri Shortcuts on the Siri Watch Face
Introduction to Siri Shortcuts
Building for Voice with Siri Shortcuts