>>>>>>>>iOS中的多線程有以下幾個辦法
1.performSelector(InBackground or MainThread)
這個方法比較方便,但是問題在於參數傳遞只能支持一個對象(傳多個參數,我是將其打包在一個NSDictionary裡面)
2.NSOperationQueue
這個方法稍微復雜,提供了每個任務的封裝(NSOperation)。可以繼承NSOperation之後,在main函數中寫一些同步執行的代碼,然後放到一個Queue之中,Queue自動管理Operation的執行和調度(在UI線程以外)。對於異步執行的代碼,需要重載NSOperation的好幾個函數才能正常工作(告訴Queue關於這個任務的進度以及執行情況)。
3.NSThread
這種方法我還沒有研究過,不過直覺會比較復雜。
4.GCD
在UI線程和其它線程之間切換很方便,我喜歡的方式是和NSOperationQueue搭配使用。本文著重介紹這個方法。
5,pthread
>>>>>>>>GCD的使用方法
以點擊一個按鈕,然後顯示loading,同時在後台下載一張圖片,最後將下載的圖片放到UIImageView中顯示為例。
//顯示loading
self.indicator.hidden = NO;
[self.indicator startAnimating];
//進入異步線程
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//異步下載圖片
NSURL * url = [NSURL URLWithString:@"http://anImageUrl"];
NSData * data = [NSData dataWithContentsOfURL:url];
//網絡請求之後進入主線程
dispatch_async(dispatch_get_main_queue(), ^{
//關閉loading
[self.indicator stopAnimating];
self.indicator.hidden = YES;
if (data) {//顯示圖片
self.imageView.image = [UIImage imageWithData:data];
}
});
});
這樣利用GCD可以把關於一個任務的代碼都放在一起。而不是像采用第一種方法一樣代碼到處散落。
>>>>>>> 利用GCD延遲執行任務的方法
// 延遲2秒執行:
double delayInSeconds = 2.0;
dispatch_time_t popTime = 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
});
>>>>>>> 創建自己的Queue
dispatch_queue_t custom_queue = dispatch_queue_create(“customQueue”, NULL);
dispatch_async(custom_queue, ^{
//doing something in custom_queue
});
dispatch_release(custom_queue);
>>>>>>> 利用GCD並行多個線程並且等待所有線程結束之後再執行其它任務
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, dispatch_get_global_queue(0,0), ^{
// 並行執行的線程一
});
dispatch_group_async(group, dispatch_get_global_queue(0,0), ^{
// 並行執行的線程二
});
dispatch_group_notify(group, dispatch_get_global_queue(0,0), ^{
// 匯總結果
});