亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

GCD,線程,程序流和UI更新

GCD,線程,程序流和UI更新

寶慕林4294392 2019-12-02 13:55:48
我很難弄清楚如何將所有這些放在一起。我在Mac上有一個難題解決應用程序。您輸入難題,按一個按鈕,然后它嘗試查找解決方案的數量,最小移動量等,因此我想保持UI更新。然后,一旦計算完成,請重新啟用按鈕并更改標題。以下是按鈕選擇器和解決功能的一些示例代碼:(請記住,我從Xcode復制/粘貼,因此可能缺少一些{}或其他拼寫錯誤..但是它應該可以使您了解我的想法。我正在嘗試做?;旧?,用戶按下一個按鈕,該按鈕為ENABLED = NO,調用此函數來計算拼圖。在計算時,請使用移動/解決方案數據更新UI標簽。然后,一旦完成拼圖計算,Button為ENABLED = YES;按下按鈕時調用:- (void) solvePuzzle:(id)sender{    solveButton.enabled = NO;    solveButton.title = @"Working . . . .";    // I've tried using this as a Background thread, but I can't get the code to waitTilDone before continuing and changing the button state.    [self performSelectorInBackground:@selector(createTreeFromNode:) withObject:rootNode];    // I've tried to use GCD but similar issue and can't get UI updated.    //dispatch_queue_t queue = dispatch_queue_create("com.gamesbychris.createTree", 0);    //dispatch_sync(queue, ^{[self createTreeFromNode:rootNode];});    }    // Need to wait here until createTreeFromNode is finished.    solveButton.enabled=YES;    if (numSolutions == 0) {    solveButton.title = @"Not Solvable";    } else {        solveButton.title = @"Solve Puzzle";    }}
查看完整描述

3 回答

?
滄海一幻覺

TA貢獻1824條經驗 獲得超5個贊

dispatch_queue_t backgroundQueue;


  backgroundQueue = dispatch_queue_create("com.images.bgqueue", NULL);        



    - (void)process {    

    dispatch_async(backgroundQueue, ^(void){

    //background task

        [self processHtml];

    dispatch_async(main, ^{ 

// UI updates in main queue

   [self workDone]; 

    });


    });  

    });    

 }


查看完整回答
反對 回復 2019-12-02
?
飲歌長嘯

TA貢獻1951條經驗 獲得超3個贊

基本上,要提交到后臺隊列的任何工作都需要遵循以下代碼模式:


dispatch_queue_t queue = dispatch_queue_create("com.myappname", 0);


__weak MyClass  *weakSelf = self;  //must be weak to avoid retain cycle


//Assign async work

dispatch_async(queue, 

^{ 

   [weakSelf doWork]; 

   dispatch_async(dispatch_get_main_queue(), 

   ^{ 

      [weakSelf workDone]; 

    });

 }); 

 queue = nil;  //Using ARC, we nil out. Block always retains the queue.

永不忘記:


上面的1-queue變量是一個引用計數對象,因為它是一個專用隊列,而不是全局隊列。因此,它被在該隊列內執行的塊保留。在此任務完成之前,不會釋放它。


2-每個隊列都有自己的堆棧,這將作為遞歸操作的一部分進行分配/釋放。您只需要擔心引用成員計數的類成員變量(強,保留等),這些變量可以在上面的doWork中訪問。


3-在后臺隊列操作中訪問那些引用計數的var時,您需要根據應用程序的使用情況使它們成為線程安全的。示例包括對對象(例如字符串,數組等)的寫操作。這些寫操作應封裝在@synchronized關鍵字中,以確保線程安全訪問。


@synchronized 確保在執行其封裝的塊期間,沒有其他線程可以訪問其保護的資源。


@synchronized(myMutableArray)

{

    //operation

}

在上面的代碼塊中,任何其他線程都不允許myMutableArray對該@synchronized塊內部進行任何更改。


查看完整回答
反對 回復 2019-12-02
  • 3 回答
  • 0 關注
  • 758 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號