GCD ios 總結

來源:互聯網
上載者:User

有 2 種向主隊列指派任務的方法,兩者都是非同步,即使在任務沒有執行的時候也讓你

的程式繼續:

dispatch_async function 在指派隊列上執行一個 Block Object。 

dispatch_async_f function 在指派隊列上執行一個 C 函數。

 

一、dispatch_async function 在指派隊列上執行一個 Block Object

Dispatch_sync 方法不能在主隊列中調用,因為無限期的阻止線程並會導致你的應用死 鎖。所有通過 GCD 提交到主隊列的任務必須非同步提交。

dispatch_queue_t mainQueue=dispatch_get_main_queue();

    dispatch_async(mainQueue, ^{

        

        [[[UIAlertView alloc] initWithTitle:@"GCD"

                                    message:@"GCD is amazing!"

                                   delegate:nil cancelButtonTitle:@"OK"

                          otherButtonTitles:nil, nil] show];

        

    }) ;

二、dispatch_async_f function 在指派隊列上執行一個 C 函數

Dispatch_get_global_queue 函數的第一個參數說明了並發隊列的優先順序,這個屬性 GCD

必須替程式員檢索。優先順序越高,將提供更多的 CPU Timeslice 來擷取該隊列執行的代碼。

你可以使用下面這些值作為 Dispatch_get_global_queue 函數的第一個參數: DISPATCH_QUEUE_PRIORITY_LOW

您的任務比正常任務用到更少的 Timeslice。

DISPATCH_QUEUE_PRIORITY_DEFAULT

執行代碼的預設系統優先順序將應用於您的任務。

DISPATCH_QUEUE_PRIORITY_HIGH

和正常任務相比,更多的 Timeslices 會應用到你的任務中。

Dispatch_get_global_queue 函數的第二個參數已經儲存了,你只要一直給它輸入數值 0就可以了。

dispatch_queue_t queue= dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

    size_t numberOfIteration=10;

    dispatch_async(queue, ^{

        

       dispatch_apply(numberOfIteration, queue, ^(size_t iteration) {

           //

           NSLog(@"-----dispatch");

       });

        

    });

三、

在 GCD 的協助下能夠非同步執行 Non-UI 相關任務

dispatch_queue_t currentQueue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

    dispatch_async(currentQueue, ^{

       

        __block UIImage *image=nil;

        dispatch_sync(currentQueue, ^{

           

            //download the image here

            NSString *urlAsString = @"http://images.apple.com/mobileme/features/images/ipad_findyouripad_20100518.jpg";

            NSURLRequest *urlRequest=[NSURLRequest requestWithURL:[NSURL URLWithString:urlAsString]];

            NSError *downloadError=nil;

            NSData *imageData=[NSURLConnection sendSynchronousRequest:urlRequest returningResponse:nil error:&downloadError];

            if (downloadError == nil && imageData != nil){

                image = [UIImage imageWithData:imageData]; /* We have the image. We can use it now */

            }

            else if (downloadError != nil)

            {

                NSLog(@"Error happened = %@", downloadError);

            }

            else

            {

                    NSLog(@"No data could get downloaded from the URL.");

            }

            

        });

        

        

        dispatch_sync(dispatch_get_main_queue(), ^{

           

            //show the image to the user here on the main queue

            if (image != nil){

                /* Create the image view here */

                UIImageView *imageView = [[UIImageView alloc]

                                          initWithFrame:self.view.bounds];

                /* Set the image */ [imageView setImage:image];

                /* Make sure the image is not scaled incorrectly */

                [imageView setContentMode:UIViewContentModeScaleAspectFit];

                /* Add the image to this view controller's view */ [self.view addSubview:imageView];

            } else

            {

                NSLog(@"Image isn't downloaded. Nothing to display.");

            }

            

        });

        

    });

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.