UI相關
TableView
tableview的cell高度自動判斷:
以下function皆
return UITableViewAutomaticDimension
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat
func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat
背景處理相關
GCD(Grand Central Dispatch)
即
Dispatch Queues
,屬於底層的C API,又分為兩種:
1.serial queuesmain thread是系統所擁有的唯一serial queue
一次只會執行一個任務
一定要創建一個新的,否則會與main thread相沖
let queue = DispatchQueue(label: "requestData")
2.concurrent queues
不能保證執行順序
系統提供四個Global Dispatch queues
- DISPATCH_QUEUE_PRIORITY_HIGH
- DISPATCH_QUEUE_PRIORITY_DEFAULT
- DISPATCH_QUEUE_PRIORITY_BACKGROUND DISPATCH_QUEUE_PRIORITY_LOW
可自行建立:
let queue = dispatch_queue_create("QUEUE的唯一名稱", DISPATCH_QUEUE_CONCURRENT)
可由系統取得:
let queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
以上兩種的共通點
- 任務皆FIFO,但看有無保證執行先後順序
Operation Queues
默認情況下Operation Queues是concurrent的方式執行,但可藉由增加相依屬性讓他變成序列方式執行
即NSOperationQueue,任務除了可以直接以block方式加入,還可以以NSOperation instance的方式被加入NSOperationQueue
NSOperation為抽象類別,因此必須使用他的子類別:
- NSBlockOperation
- 可包含多個block
- 所有block被執行完才視為執行完畢
- NSInvocationOperation
- 僅包含一個block
- 可用來呼叫指定的selector
- NSBlockOperation
與GCD的差異
- 不遵循FIFO
- 可取消任務
- 若任務已完成,則不會有影響
- 若任務進行中,不會強制停止任務,而是將cancel屬性設為true
- 若任務還在序列中,則之後不會被執行