GCD = Grand Central Dispatch,是蘋果開發(fā)中針對多線程編程的一個框架,在iOS4.0中引入。
>>>>>>>>iOS中的多線程有以下幾個辦法
1.performSelector(InBackground or MainThread)
這個方法比較方便,但是問題在于參數(shù)傳遞只能支持一個對象(傳多個參數(shù),我是將其打包在一個NSDictionary里面)
2.NSOperationQueue
這個方法稍微復(fù)雜,提供了每個任務(wù)的封裝(NSOperation)。可以繼承NSOperation之后,在main函數(shù)中寫一些同步執(zhí)行的代碼,然后放到一個Queue之中,Queue自動管理Operation的執(zhí)行和調(diào)度(在UI線程以外)。對于異步執(zhí)行的代碼,需要重載NSOperation的好幾個函數(shù)才能正常工作(告訴Queue關(guān)于這個任務(wù)的進度以及執(zhí)行情況)。
3.NSThread
這種方法我還沒有研究過,不過直覺會比較復(fù)雜。
4.GCD
在UI線程和其它線程之間切換很方便,我喜歡的方式是和NSOperationQueue搭配使用。本文著重介紹這個方法。
>>>>>>>>GCD的使用方法
以點擊一個按鈕,然后顯示loading,同時在后臺下載一張圖片,最后將下載的圖片放到UIImageView中顯示為例。
//顯示loading
self.indicator.hidden=NO;
[self.indicator?startAnimating];
//進入異步線程
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0),^{
//異步下載圖片
NSURL*url=[NSURLURLWithString:@“http://anImageUrl”];
NSData*data=[NSDatadataWithContentsOfURL:url];
//網(wǎng)絡(luò)請求之后進入主線程
dispatch_async(dispatch_get_main_queue(),^{
//關(guān)閉loading
[self.indicator?stopAnimating];
self.indicator.hidden=YES;
if(data){//顯示圖片
self.imageView.image=[UIImageimageWithData:data];
}
});
});
這樣利用GCD可以把關(guān)于一個任務(wù)的代碼都放在一起。而不是像采用第一種方法一樣代碼到處散落。
>>>>>>> 利用GCD延遲執(zhí)行任務(wù)的方法
//?延遲2秒執(zhí)行:
doubledelayInSeconds=2.0;
dispatch_time_tpopTime=dispatch_time(DISPATCH_TIME_NOW,delayInSeconds*NSEC_PER_SEC);
dispatch_after(popTime,dispatch_get_main_queue(),^(void){
//?code?to?be?executed?on?the?main?queue?after?delay
});
>>>>>>> 創(chuàng)建自己的Queue
dispatch_queue_tcustom_queue=dispatch_queue_create(“customQueue”,NULL);
dispatch_async(custom_queue,^{
//doing?something?in?custom_queue
});
dispatch_release(custom_queue);
>>>>>>> 利用GCD并行多個線程并且等待所有線程結(jié)束之后再執(zhí)行其它任務(wù)
dispatch_group_tgroup=dispatch_group_create();
dispatch_group_async(group,dispatch_get_global_queue(0,0),^{
//?并行執(zhí)行的線程一
});
dispatch_group_async(group,dispatch_get_global_queue(0,0),^{
//?并行執(zhí)行的線程二
});
dispatch_group_notify(group,dispatch_get_global_queue(0,0),^{
//?匯總結(jié)果
});
參考