iOS UI非同步更新:dispatch_async 與 dispatch_get_global_queue 的使用方法

來源:互聯網
上載者:User

標籤:

GCD (Grand Central Dispatch) 是Apple公司開發的一種技術,它旨在最佳化多核環境中的並行作業並取代傳統多線程的編程模式。 在Mac OS X 10.6和IOS 4.0之後開始支援GCD。

使用GCD的一個理由就是方便。回想一下以前的多線程編程,我們會把非同步呼叫的代碼放到另外的一個函數中,並通過NSThread開啟新線程來啟動這段代碼。 這種跳來跳去的流程對於複雜的邏輯簡直就是一場災難。更糟糕的是,調用線程時的環境對非同步代碼是不可見的,如果我們需要當時的臨時變數的話只有兩個選擇: 儲存到類成員變數中或者作為參數傳遞過去。前者會造成很多莫名奇妙的無關類成員,而後者的功能過於有限。

 

-(void) referCurrencyRate:(UIButton *)btn{

    activity.hidden=NO;

    [activity startAnimating];

 

   // may be get param

   //

     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

      //do lost large time works

         NSString *rate=  [NetConnect GetCurrentcyRateTester:@""];

 

         dispatch_async(dispatch_get_main_queue(), ^{

             //繼續UI 更新等

             UIAlertView* alert = [[UIAlertView alloc] initWithTitle:@"提示"

                                                             message:rate

                                                            delegate:nil

                                                   cancelButtonTitle:@"確定"

                                                   otherButtonTitles:nil];

             

             [alert show];

             [activity stopAnimating];

             [activity setHidesWhenStopped:YES];

        });

    });

  

   // [NSTimer scheduledTimerWithTimeInterval:5.5 target:self selector:@selector(hid) userInfo:nil repeats:NO];

}

在上面的代碼中,出現了一種奇怪的格式:

^{code...}

解釋一下,當一段代碼被花括弧包裹並在開頭放置上尖號時,我們稱之為塊(block)。如果你學過C語言的話(實際上,block正是apple對C的一個擴充), 你可以認為這是一個增強型的函數指標。它不僅可以當做一個變數來回傳遞,還可以引用本身環境之外的變數(如上面代碼中的parameter)。 更進一步地說,它是apple的C擴充中閉包的實現。在block裡引用的對象會自動被retain,因此你也不必擔心記憶體的問題。

另外涉及到了三個函數

void dispatch_async(    dispatch_queue_t queue,    dispatch_block_t block);dispatch_queue_t dispatch_get_global_queue(    long priority,    unsigned long flags); dispatch_get_main_queue();  

dispatch_async 函數會將傳入的block塊放入指定的queue裡運行。這個函數是非同步,這就意味著它會立即返回而不管block是否運行結束。因此,我們可以在block裡運行各種耗時的操作(如網路請求) 而同時不會阻塞UI線程。 
dispatch_get_global_queue 會擷取一個全域隊列,我們姑且理解為系統為我們開啟的一些全域線程。我們用priority指定隊列的優先順序,而flag作為保留欄位備用(一般為0)。 
dispatch_get_main_queue 會返回主隊列,也就是UI隊列。它一般用於在其它隊列中非同步完成了一些工作後,需要在UI隊列中更新介面(比如上面代碼中的[self updateUIWithResult:result])的情況。

好的,知道這些特性之後,我們可以這樣理解上面的代碼:利用parameter變數非同步地發起一個網路請求,並在請求之後更新UI線程。

這種需求很常見,諸如頁面資料重新整理等,基本IOSAPP這種展示的類的東西,這種用法常見。之前,我做指標的使用都是定時器,現在都改成這種了。

定時器也可以實現這種方法,但是這不是定時器該做的事。

iOS UI非同步更新:dispatch_async 與 dispatch_get_global_queue 的使用方法

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.