iOS中多線程編程工具主要有:
- NSThread
- NSOperation
- GCD
這三種方法都簡(jiǎn)單易用,各有千秋.但無(wú)疑GCD是最有誘惑力的,因?yàn)槠浔旧硎莂pple為多核的并行運(yùn)算提出的解決方案.雖然當(dāng)前移動(dòng)平臺(tái)用雙核的不多,但不影響GCD作為多線程編程的利器(ipad2已經(jīng)是雙核了,這無(wú)疑是一個(gè)趨勢(shì)).
GCD是和block緊密相連的,所以最好先了解下block可以查看
點(diǎn)擊這里GCD是C level的函數(shù),這意味著它也提供了C的函數(shù)指針作為參數(shù),方便了C程序員.
下面首先來(lái)看GCD的使用:
dispatch_async(dispatch_queue_t queue, dispatch_block_t block);
async表明異步運(yùn)行,block代表的是你要做的事情,queue則是你把任務(wù)交給誰(shuí)來(lái)處理了.(除了async,還有sync,delay,本文以async為例).
之所以程序中會(huì)用到多線程是因?yàn)槌绦蛲鶗?huì)需要讀取數(shù)據(jù),然后更新UI.為了良好的用戶體驗(yàn),讀取數(shù)據(jù)的操作會(huì)傾向于在后臺(tái)運(yùn)行,這樣以避免阻塞主線程.GCD里就有三種queue來(lái)處理
1. Main queue:
顧名思義,運(yùn)行在主線程,由dispatch_get_main_queue獲得.和ui相關(guān)的就要使用Main Queue.
2.Serial quque(private dispatch queue)
每次運(yùn)行一個(gè)任務(wù),可以添加多個(gè),執(zhí)行次序FIFO. 通常是指程序員生成的,比如:
NSDate *da = [NSDate date];
NSString *daStr = [da description];
const char *queueName = [daStr UTF8String];
dispatch_queue_t myQueue = dispatch_queue_create(queueName, NULL);
3. Concurrent queue(global dispatch queue):
可以同時(shí)運(yùn)行多個(gè)任務(wù),每個(gè)任務(wù)的啟動(dòng)時(shí)間是按照加入queue的順序,結(jié)束的順序依賴各自的任務(wù).使用dispatch_get_global_queue獲得.
所以我們可以大致了解使用GCD的框架:
dispatch_async(getDataQueue,^{
//獲取數(shù)據(jù),獲得一組后,刷新UI.
dispatch_aysnc (mainQueue, ^{
//UI的更新需在主線程中進(jìn)行
};
}
)
由此可見(jiàn),GCD的使用非常簡(jiǎn)單,以我的使用經(jīng)驗(yàn)來(lái)看,以后會(huì)逐步淘汰使用NSOperation而改用GCD.