2015-04-17 53 views
1

我使用大中央調度在Objective-C使用下面的代碼發起非同步線程:iOS爲什麼不從子線程工作中退出主線程中的方法?

dispatch_queue_t myQueue = dispatch_queue_create("My Queue",NULL); 
    dispatch_async(myQueue, ^{ 

} 

因爲我遇到了麻煩,正確地退出觸發這個IBAction爲一個長的時間。我做了很多的代碼在主線程中使用此代碼這個GCD線程內包裝:

[[NSOperationQueue mainQueue] addOperationWithBlock:^{ 

} 

我最初試圖做的就是簡單地把回報;這個mainQueue塊內的語句。經過大量的擺弄之後,我發現打破了包含所有這些回報的IBAction;需要在GCD隊列中。

這是爲什麼?我認爲無論程序在哪裏,返回都會退出。另外,是否有可能從這樣的嵌套隊列中退出?

+0

你在不同的線程中運行什麼工作?網絡代碼?廣泛的操作等? 如果你要使用不同的線程,你應該期待代碼稍後完成,響應完成應該通過回調方法等。只是因爲你已經在主線程中包裝了一些代碼,並不意味着它會運行直接 –

+0

@Naughty_Ottsel查看我是否應該返回的檢查是啓動異步線程後的第一個動作。任何網絡密集的東西都是在之後完成另外,主隊列在檢查後直接調用,看看它是否應該返回,所以在調用之前不應該有太多延遲。在我找到它應該去的地方之前,在主要隊列中的返回檢查也是該區塊的第一個動作,所以希望不會有任何延遲。 –

+2

理論上,在異步線程中運行主代碼應該是安全的。在我看來,你應該通過另一個GCD塊運行主線程代碼。我認爲NSOperation代碼是一種「得到補充並最終運行」的代碼,GCD具有更高的優先級。 FYI: dispatch_async(dispatch_get_main_queue(),^ {}); –

回答

1

塊與函數類似。它與定義它的代碼是不同的上下文。塊中的return語句退出該塊,而不是塊中定義的方法或函數。 (如果塊具有非void返回類型,return聲明還給出了塊的返回值。)

例如,請考慮:

void foo(void) 
{ 
    int (^block)(int, int) = ^int(int a, int b) { return a + b; } 

    printf("3 + 5 = %d\n", block(3, 5)); 
} 

塊中的return語句不返回從foo(),它只是從塊中返回並給出塊的返回值。該塊就像一個單獨的函數,只是它的代碼正好位於另一個函數的中間,它可以從其定義的上下文中捕獲局部變量。

現在,給予dispatch_async()的塊不帶參數或返回值,但return語句的流量控制是相同的。它從該塊返回,而不是包含調用dispatch_async()的方法或函數。特別是,因爲dispatch_async()異步運行該塊,所以很可能(甚至可能)該塊將不會運行,直到調用dispatch_async()的方法或函數已經退出爲止。

相關問題