2016-06-14 84 views
0

所以我有這種情況,我想循環聲音並逐漸減少聲音之間的延遲。意思是,隨着時間的推移,聲音應該最常播放。經過一定的時間延遲後重復短音

現在,我使用的AVAudioPlayer的聲音持續時間爲1秒,但實際聲音持續時間僅爲0.5秒。聲音的另一個0.5秒是沉默的。所以,當我使用numberOfLoops屬性並將其設置爲-1(無盡重複)並結合使用AVAudioPlayer上的rate屬性並將其更改爲比1更高的值時,我會得到期望的結果......但是,這並不理想,因爲聲音可能會變形(因爲音高)。

我正在尋找像SpriteKit中的SKAction之類的東西,例如,我可以在某些延遲之後運行代碼塊...在UIKit中執行此操作的最佳方式是什麼?

+0

你看過使用NSTimer事件嗎,比如[NSTimer scheduledTimerWithTimeInterval:?你總是可以讓事件創建一個更短更短的新事件,每次發起你的聲音動作 – Dominic

+0

@Dominic其實我完全忘記了這個想法,因爲我主要使用SpriteKit並且在SpriteKit中NSTimer是一個不大部分時間:) – Whirlwind

回答

0

要想在UIKit中延遲一段時間後運行代碼塊,一種方法是使用GCD,即dispatch_after。

- (void)myMethod { 
     __weak __typeof__(self) weakSelf = self; 
     dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(self.dispatchInterval * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 
      if (weakSelf.isRunning){ 
       [weakSelf myMethod]; 
      } 
     }); 

     // Code to play audio here 
    } 

這裏,dispatchInterval是一個浮點數,表示循環重複之前的秒數。因此,只需更新dispatchInterval以減少每次觸發時的循環長度。要啓動循環,只需將isRunning設置爲YES並呼叫myMethod,即可將isRunning設置爲NO來停止循環。這種方法避免了必須使用NSTimer,這可能導致保留強烈的自我引用問題。

+0

感謝您的回覆。那麼NSTimer將擁有強大的自我,但我們有NSTimer無效的方法,對吧? – Whirlwind

+0

順便說一下,我必須將dispatchInterval定義爲屬性嗎? – Whirlwind

+0

Theres關於這方面的討論http://stackoverflow.com/questions/16821736/weak-reference-to-nstimer-target-to-prevent-retain-cycle。基本上,如果你不依賴於擁有定時器的對象的銷燬來使其無效,那麼使用定時器就可以了!我猜想會更簡單一些,但至少現在你有兩種選擇。 – GCBenson