WWDC2018—What's New in Cocoa Touch

前言

今日頭條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在顯示的時候分為這幾步僻孝。

  1. 先從緩存隊列中取出一個cell或者是直接創(chuàng)建一個cell
  2. 將model數據傳入cell,而這一步具體的消耗如何就要看數據的獲取方式了守谓,你可能從數據庫中獲取穿铆,也可能從網絡中獲取,總之這可能是一個相當耗時的工作斋荞。
  3. cell調用layoutSubviews為子視圖布局
  4. 調用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開銷太大帅霜。

image.png

所以在后面有了改進,如下圖所示呼伸,它是在當前cell load完成的時候去異步prefetch下一個cell的數據的身冀。這樣就避免prefetch對當前cell繪制的影響。

image.png

另外還發(fā)現了一個case括享,如果在設備并沒有滿載的時候搂根,這個時候只是運行了一個簡單的前臺程序的滑動工作,CPU并不知道將來的工作到底如何铃辖,它可能就會使用盡可能低的level進行工作以進行省電剩愧。但是這個時候如果來了復雜的計算(需要繪制復雜的cell),等CPU提高level再去進行計算娇斩,可能就會太遲了仁卷,就很容易造成卡頓。這個時候CPU的工作方式如圖:

image.png

因此在iOS12中犬第,會提前把要繪制的信息告訴CPU锦积,如果有復雜的任務,CPU就會提前進入高的level歉嗓,這樣提前了解App需要的CPU占用情況丰介,就能讓CPU及時改變它的level。所以在iOS12中CPU會盡可能的根據你的應用的需求情況來進行調整,這樣在達到了省電的同時還能充分利用CPU保證流暢性基矮,確實很棒淆储!

2、Memory

首先強調了一下memory對性能影響的重要性家浇,然后介紹了一下App在運行的時候本砰,內存的使用情況

image.png

當你請求一個小的內存的時候,此時內存足夠钢悲,就會直接獲取free memory点额,但是現在當你的App申請一個較大的內存的時候,這個時候就很可能內存不足莺琳,系統(tǒng)就會從Other Apps and System中去獲取还棱,也就是其它那些在后臺中的進程。雖然這能滿足我們的需求惭等,但它仍然可能在其它地方產生未知的影響珍手。而且這個過程對于我們的App來說依然會占用很多時間,所以其實對我們的應用也是有影響的辞做。因此找到一些方法來節(jié)約內存對于我們的App來說會有很大的提升琳要。下面就講到了iOS12中對圖片的一個優(yōu)化。

image.png

以上面兩個圖來說秤茅,他們的內存大小都是每個像素64位這樣來計算的稚补。但其實第二張圖并沒有完全利用所有的color位數,因為它只有黑白兩種顏色,顯然這造成了對內存的浪費。所以在iOS12中只使用了8位纺涤,所以第二種圖片在使用了Automstic Backing Store后的內存占用縮減成了下面這樣,這對于App的內存占用是一個很大的提高乍惊。

image.png

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中通過團隊的努力還是把計算復雜度盡其所能的進行了降低。

image.png

然后再說更加復雜的約束相互有依賴的視圖亭姥,iOS12之前隨著視圖的增多稼钩,frame的計算復雜度是在呈指數上漲的。所以之前使用autolayout的話性能瓶頸是很明顯的达罗,稍微復雜一點的視圖我們可能都會放棄autolayout坝撑。但是在iOS12中静秆,autolayout的計算不再呈指數上漲了。通過優(yōu)化也已經實現線性增加的復雜度巡李。對于嵌套視圖來說抚笔,也是如此,復雜度由指數級下降至線性級侨拦。

image.png

這樣一來殊橙,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甚至可以直接回復信息

image.png
  • Grouping

iOS中的notification已經默認支持分組附帽,也就是說默認情況下一個應用的通知都會被分為一個group進行展示埠戳。當然你也可以進行個人定制,可以通過給通知標記thread identifier蕉扮,這樣所有有相同的thread identifier的通知都會出現在同一個group整胃。

image.png
  • settings

iOS12新的的通知UI增加了Notification settings。Notification settings支持用戶根據他們自己的行為定制個性化的通知喳钟,或者
你也可以通過iOS12中一個新的API來為用戶深入定制與你應用相關的setting屁使。


image.png

更多與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中蜕该,并且在用戶下次輸入的時候自動填充密碼。

image.png

image.png

另外在短信驗證中洲鸠,獲取驗證碼后也就不用來回切換app了堂淡,系統(tǒng)會自動識別驗證碼。


image.png

總之扒腕,在strong passwords的使用下绢淀,我們再也不用為各種各樣的密碼和驗證碼而煩惱啦。更多詳細內容可以看這篇sessionAutomatic Strong Passwords and Security Code AutoFill

4瘾腰、safeArea

safeArea可以確保我們的內容不會超出內容正確顯示范圍皆的,比如一些top bar,bottom bar啥的蹋盆。safeArea的計算其實是非常復雜的费薄,它會根據不同的設備進行不同的比例縮放∑芪恚總之它給了我們一個安全的區(qū)域讓我們去填充我們的視圖楞抡。

image.png
image.png

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

如果你想使用更多定制化的內容的話,就可以使用它了闷板。它包含的內容很多澎灸,如圖所示:

image.png

這些是一些去年都已經有的內容,在iOS12中遮晚,你可以定義自己的內容性昭。
這里也只是簡單的介紹了一下,想要詳細了解的話這里推薦了三篇session

Siri Shortcuts on the Siri Watch Face
Introduction to Siri Shortcuts
Building for Voice with Siri Shortcuts

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末县遣,一起剝皮案震驚了整個濱河市糜颠,隨后出現的幾起案子,更是在濱河造成了極大的恐慌萧求,老刑警劉巖其兴,帶你破解...
    沈念sama閱讀 219,589評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異夸政,居然都是意外死亡元旬,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 93,615評論 3 396
  • 文/潘曉璐 我一進店門守问,熙熙樓的掌柜王于貴愁眉苦臉地迎上來匀归,“玉大人,你說我怎么就攤上這事酪碘∨笃” “怎么了盐茎?”我有些...
    開封第一講書人閱讀 165,933評論 0 356
  • 文/不壞的土叔 我叫張陵兴垦,是天一觀的道長。 經常有香客問我字柠,道長探越,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,976評論 1 295
  • 正文 為了忘掉前任窑业,我火速辦了婚禮钦幔,結果婚禮上,老公的妹妹穿的比我還像新娘常柄。我一直安慰自己鲤氢,他們只是感情好搀擂,可當我...
    茶點故事閱讀 67,999評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著卷玉,像睡著了一般哨颂。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上相种,一...
    開封第一講書人閱讀 51,775評論 1 307
  • 那天威恼,我揣著相機與錄音,去河邊找鬼寝并。 笑死箫措,一個胖子當著我的面吹牛,可吹牛的內容都是我干的衬潦。 我是一名探鬼主播斤蔓,決...
    沈念sama閱讀 40,474評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼别渔!你這毒婦竟也來了附迷?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,359評論 0 276
  • 序言:老撾萬榮一對情侶失蹤哎媚,失蹤者是張志新(化名)和其女友劉穎喇伯,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體拨与,經...
    沈念sama閱讀 45,854評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡稻据,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,007評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了买喧。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片捻悯。...
    茶點故事閱讀 40,146評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖淤毛,靈堂內的尸體忽然破棺而出今缚,到底是詐尸還是另有隱情,我是刑警寧澤低淡,帶...
    沈念sama閱讀 35,826評論 5 346
  • 正文 年R本政府宣布姓言,位于F島的核電站,受9級特大地震影響蔗蹋,放射性物質發(fā)生泄漏何荚。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,484評論 3 331
  • 文/蒙蒙 一猪杭、第九天 我趴在偏房一處隱蔽的房頂上張望餐塘。 院中可真熱鬧,春花似錦皂吮、人聲如沸戒傻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽需纳。三九已至冈止,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間候齿,已是汗流浹背熙暴。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留慌盯,地道東北人周霉。 一個月前我還...
    沈念sama閱讀 48,420評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像亚皂,于是被迫代替她去往敵國和親俱箱。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,107評論 2 356

推薦閱讀更多精彩內容