2012-08-17 112 views
1

我正在爲包含動畫之間的轉動的iPhone創建一個基於回合的遊戲,並且我想在代碼中內聯[UIView animateWithDuration:...]方法調用。有沒有辦法讓這個調用同步而不是異步?目前,我在做什麼是...iPhone:等到UIView動畫完成

// Some code... 

NSConditionLock *conditionLock = [[NSConditionLock alloc] initWithCondition:0]; 

dispatch_sync(dispatch_get_main_queue(), ^{ 
    [UIView animateWithDuration:1 
        animations:^{ 
         // some animation 
        } 
        completion:^(BOOL finished){ 
         [conditionLock lock]; 
         [conditionLock unlockWithCondition:1]; 
        }]; 
}); 


// forces thread to wait until completion block is called 
[conditionLock lockWhenCondition:1]; 


// More code... 

因此,在上面的代碼中,「//更多代碼...」只是動畫後已經完全結束爲止。很顯然,這段代碼必須在輔助線程上運行,並且可以按我的需要工作。但是,我有一種感覺,使用NSConditionLock和gcd的組合是不好的形式,並且以這種方式阻止輔助線程對於性能來說並不是最佳的。我目前的代碼是否正常,還是有更好的方法來做到這一點?謝謝。

編輯: 關鍵是「// code more ...」是內嵌的,而不是在完成塊中。 真的是我想知道的是,將NSConditionLock與GCD結合使用是否合適,如果不是,更好的方法是什麼?

+0

這種方法的問題不是你在輔助線程(即不是主線程)上運行「某些動畫」嗎?順便說一下,什麼(參考)讓你認爲把NSConditionLock和GCD結合起來是不好的形式? – Drux 2013-08-24 06:11:37

回答

2

我只是將「//更多代碼」放在另一個方法中,並在完成塊中調用該方法。這將確保您的代碼只在您的動畫完成後觸發。

+0

然而,在我的情況下,這會導致許多很多動畫必須以這種方式鏈接,使代碼組織得更少,更難以維護。 – nadnerbgalea 2012-08-17 16:04:38