code

2017年11月6日 星期一

Stanford ios 10 with Swift 筆記9 - Multithreading

Queue

ios將所有的tasks (e.g. closures / function calls)都放在不同的queue中,然後os分派給不同thread去執行。

所以依照你要達成的目的,要把task放在不同的queue中,這個動作稱為dispatching a task to a queue

ios把thread的觀念用queue包覆起來,queue比較接近人類高階理解觀念,所以threading的複雜度就被隱藏了。

Main Queue

這是UI queue,所有跟UI相關的事情都只能放到這個queue中,中,只有一個main thread負責執行queue中的task。所以這是一個serial queue。


Global Queue

general purpose queue,是concurrent queue,亦即有多threads可以執行global queue tasks。


QoS就是quality of service,可以類比成此queue的priority。Main queue理所當然有最高的QoS,可以interrupt其他queue中的tasks,搶得CPU資源。


dispatching task to  queue

可以放入一個closure (a block of code),可以async或是sync:


注意我們不能在main queue裡面呼叫 queueA.sync { ... },因為這樣會block main queue,直到queueA裡面這個closure return。main queue是UI queue,所以一但被blocked,就會freeze UI。


創建自己的queues

1. serial queue:

2. concurrent queue (非常少會做這件事,幾乎都使用Global Queue):



NSURLSession example

NSURLSession可以接受一個closure當作callback,但是文件已經註明此closure不會被dispatch到maint queue中 (在task.resume()執行之後, task會被放到非main queue中執行,所以closure callback也會在非main queue中執行),也就是closure中不可以放任何UI相關的code:


如果真的要做UI相關的動作,就要再dispatch相關的動作 包成一個closure放回去main queue,如上圖黃字。


沒有留言:

張貼留言