2012-03-22 85 views
1

我有一些代碼,如下圖所示:顯示文本

- (IBAction)startButtonPressed:(id)sender { 
    statusText.text = @"Processing..."; 

    //here I do a bunch of calculations 

    //display calculated data 
    statusText.text = [[NSString alloc] initWithFormat:@"coefficient: %.4f", 
     [[coefficientEstimatesR objectAtIndex:0] doubleValue]]; 
} 

,我這樣做需要大約17S的計算,所以我想顯示單詞「處理」,而這是正在完成。但是,當我運行這個時,「處理」從不顯示,只顯示計算的數據。

任何想法如何做到這一點,將不勝感激。 謝謝!

回答

4

不要在GUI線程中進行任何處理,而不要花費一秒鐘的時間,尤其是不要花費17秒的時間。使用GCD使得卸載任務簡單:

- (IBAction)startButtonPressed:(id)sender { 
    statusText.text = @"Processing..."; 

    dispatch_async(dispatch_get_global_queue(0, 0), ^{ 
     //here I do a bunch of calculations 

     dispatch_async(dispatch_get_main_queue(), ^{ 
      //display calculated data 
      statusText.text = [[NSString alloc] initWithFormat:@"coefficient: %.4f", 
           [[coefficientEstimatesR objectAtIndex:0] doubleValue]]; 
     }); 
    }); 
} 
+0

這是完美的,非常感謝你! – exolaris 2012-03-22 21:32:56

+0

有沒有辦法讓它在while循環中工作?我一直在嘗試沒有成功。 (我想無限期地運行計算,因爲我們試圖查看在ipad/ipod死亡之前我們可以運行這個應用程序多少次,這是出於研究目的,並且我需要打印迄今完成的迭代次數以及每次通過while循環計算係數)。 – exolaris 2012-03-22 21:55:15

+0

看到內部調用dispatch_async()?您可以隨時通過計算代碼更新狀態。你會很好地閱讀GCD - 一旦你理解它就很容易使用。 – Caleb 2012-03-22 22:15:26

1

然而,當我運行此,「處理」從不顯示,僅顯示 計算的數據。

這是因爲繪圖發生在主線程上。如果您將主線程與您的計算綁定在一起,您將會阻止應該發生的其他事情,包括繪製狀態文本。

取而代之,請設置您的狀態文本,觸發後臺線程(或將塊分派給隊列等),然後儘快從您的操作方法返回。計算完成後,後臺線程(或塊)會調用主線程上的方法,以便您可以再次更改狀態文本。