你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> IOS開發(50)之GCD的一些小應用

IOS開發(50)之GCD的一些小應用

編輯:IOS開發綜合

>>>>>>>>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), ^{
        // 匯總結果
    });

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved