在iOS開發(fā)中利用GCD進行多線程編程

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é)果

});

參考

http://blog.iosxcode4.com/archives/212

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容