第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

GCD,線(xiàn)程,程序流和UI更新

GCD,線(xiàn)程,程序流和UI更新

寶慕林4294392 2019-12-02 13:55:48
我很難弄清楚如何將所有這些放在一起。我在Mac上有一個(gè)難題解決應(yīng)用程序。您輸入難題,按一個(gè)按鈕,然后它嘗試查找解決方案的數(shù)量,最小移動(dòng)量等,因此我想保持UI更新。然后,一旦計(jì)算完成,請(qǐng)重新啟用按鈕并更改標(biāo)題。以下是按鈕選擇器和解決功能的一些示例代碼:(請(qǐng)記住,我從Xcode復(fù)制/粘貼,因此可能缺少一些{}或其他拼寫(xiě)錯(cuò)誤..但是它應(yīng)該可以使您了解我的想法。我正在嘗試做?;旧?,用戶(hù)按下一個(gè)按鈕,該按鈕為ENABLED = NO,調(diào)用此函數(shù)來(lái)計(jì)算拼圖。在計(jì)算時(shí),請(qǐng)使用移動(dòng)/解決方案數(shù)據(jù)更新UI標(biāo)簽。然后,一旦完成拼圖計(jì)算,Button為ENABLED = YES;按下按鈕時(shí)調(diào)用:- (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 回答

?
滄海一幻覺(jué)

TA貢獻(xiàn)1824條經(jīng)驗(yàn) 獲得超5個(gè)贊

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]; 

    });


    });  

    });    

 }


查看完整回答
反對(duì) 回復(fù) 2019-12-02
?
飲歌長(zhǎng)嘯

TA貢獻(xiàn)1951條經(jīng)驗(yàn) 獲得超3個(gè)贊

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


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變量是一個(gè)引用計(jì)數(shù)對(duì)象,因?yàn)樗且粋€(gè)專(zhuān)用隊(duì)列,而不是全局隊(duì)列。因此,它被在該隊(duì)列內(nèi)執(zhí)行的塊保留。在此任務(wù)完成之前,不會(huì)釋放它。


2-每個(gè)隊(duì)列都有自己的堆棧,這將作為遞歸操作的一部分進(jìn)行分配/釋放。您只需要擔(dān)心引用成員計(jì)數(shù)的類(lèi)成員變量(強(qiáng),保留等),這些變量可以在上面的doWork中訪(fǎng)問(wèn)。


3-在后臺(tái)隊(duì)列操作中訪(fǎng)問(wèn)那些引用計(jì)數(shù)的var時(shí),您需要根據(jù)應(yīng)用程序的使用情況使它們成為線(xiàn)程安全的。示例包括對(duì)對(duì)象(例如字符串,數(shù)組等)的寫(xiě)操作。這些寫(xiě)操作應(yīng)封裝在@synchronized關(guān)鍵字中,以確保線(xiàn)程安全訪(fǎng)問(wèn)。


@synchronized 確保在執(zhí)行其封裝的塊期間,沒(méi)有其他線(xiàn)程可以訪(fǎng)問(wèn)其保護(hù)的資源。


@synchronized(myMutableArray)

{

    //operation

}

在上面的代碼塊中,任何其他線(xiàn)程都不允許myMutableArray對(duì)該@synchronized塊內(nèi)部進(jìn)行任何更改。


查看完整回答
反對(duì) 回復(fù) 2019-12-02
  • 3 回答
  • 0 關(guān)注
  • 755 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)