在后臺(tái)邑茄,我們的app其實(shí)是在同一時(shí)間內(nèi)運(yùn)行著多種集合的命令指示,也就是說這個(gè)app可以同時(shí)使用2個(gè)或者3個(gè)cpu中心峭范。每一個(gè)cpu都能獨(dú)立的完成自己的工作径玖,這也大大提升了app的性能。這種工作原理就叫做threads纪挎,它有以下幾點(diǎn)重要的附加條件(provisos):
- threads執(zhí)行你所給它的代碼期贫,它并不是隨機(jī)的從每一個(gè)viewDidLoad()找?guī)仔写a來執(zhí)行。這也就是說异袄,系統(tǒng)是默認(rèn)只使用一個(gè)cpu來執(zhí)行代碼的通砍,因?yàn)槲覀儧]有創(chuàng)建給其他cpu執(zhí)行的threads。
- 所有的user interface的工作都必須發(fā)生在main thread中烤蜕,main thread也就是我們程序建立的初始thread封孙。如果你想嘗試在其他thread中執(zhí)行這些代碼,那結(jié)果也許會(huì)成功讽营,也許會(huì)失敗虎忌,也許會(huì)誘發(fā)一些出人意料的問題,或者干脆它會(huì)崩潰橱鹏。
- 我們無法控制什么時(shí)候thread會(huì)被執(zhí)行膜蠢,或者以什么樣的順序來執(zhí)行。我們只是創(chuàng)建threads莉兰,把它們交給系統(tǒng)挑围,讓系統(tǒng)來以最優(yōu)的方式去決定什么時(shí)候,以什么樣的順序來執(zhí)行糖荒。
- 因?yàn)槲覀儫o法控制執(zhí)行順序杉辙,我們必須要十分警惕的確保每次只有一個(gè)thread在更改我們的數(shù)據(jù)。
大體來講寂嘉,如果你在訪問遠(yuǎn)程資源奏瞬,那應(yīng)該使用后臺(tái)thread(任何一個(gè)不是main
thread的thread)。如果你在執(zhí)行一些緩慢的代碼泉孩,那也用后臺(tái)thread硼端;或者有一些可以平行執(zhí)行的代碼,比如要給100張照片加濾鏡寓搬,那就使用若干個(gè)后臺(tái)threads來執(zhí)行他們珍昨。
這里說一下GCD(Grand Central Dispatch),GCD的能力就是讓我們不用再去考慮創(chuàng)建和使用多線程(multithreading)的麻煩,我們不用去考慮如何創(chuàng)建或者銷毀線程句喷,不用去考慮我們是否創(chuàng)建了最佳數(shù)量的線程镣典,GCD自動(dòng)的給我們創(chuàng)建線程,并且會(huì)以最佳的方式來創(chuàng)建執(zhí)行唾琼。
GCD automatically handles thread creation and management, automatically balances based on available system resources, and automatically factors in Quality of Service to ensure your code runs as efficiently as possible.