2014-03-01 162 views
1

我正在爲iOS編寫音樂遊戲。我試圖做的是讓電腦播放一首曲子,其中包括調用播放聲音,暫停和調用播放不同聲音的另一種方法的方法。延遲/睡眠呼叫方法

所以我想弄清楚如何調用這些方法的延遲/睡眠。我發現了兩種非常麻煩的方法。首先是不要使用

[self performSelector:@selector(startNotePlay:) withObject:button afterDelay:.5]; 
    [self performSelector:@selector(startNotePlay:) withObject:button afterDelay:2.5]; 
    etc etc... 

但是這種方式是很煩人的,因爲所有的方法被調用一次,因此延遲必須保持考慮暫停多長時間和筆記之前玩多久。所以很多數學需要做...

第二種方法是使用睡眠,這是更容易。

[self performSelector:@selector(startNotePlay:) withObject:button afterDelay:.5]; 
sleep(2.0); 
[self performSelector:@selector(startNotePlay:) withObject:button afterDelay:1.5]; 

這個問題是睡眠關閉主線程。所以當睡眠發生時,我無法做任何UI更改。

這兩者之間有什麼?無論如何,基本上不用關閉所有東西就可以進行睡眠。或者類似的,執行此方法,然後在X延遲後執行該方法?

感謝您的幫助, 加布

+2

您使用哪個API來播放聲音?你怎麼知道這些聲音有多長?用戶是否可以在聲音之間暫停(或者您是否需要取消)? – Wain

回答

0

如何進行一個選擇,然後再執行另外一個這裏面一個延遲之後?那樣的話,你知道那個會在另一個之後脫落? :)

否則,你也許可以在一定的時間使用正是基於此信息timeIntervalSinceNow

0

執行的方法,我建議在後臺線程上運行此代碼。我假設你的音符播放代碼必然在主線程中運行。你可以或多或少地使用類似的東西來獲得你正在尋找的時機。

dispatch_queue_t queue = dispatch_queue_create("musicQueue", NULL); 
dispatch_async(queue, ^{ 
    dispatch_async(dispatch_get_main_queue() ^{ 
     [self performSelector:@selector(startNotePlay:) withObject:button afterDelay:.5]; 
    }); 
}); 
dispatch_async(queue, ^{ 
    sleep(2.0f); 
}); 
dispatch_async(queue, ^{ 
    dispatch_sync(dispatch_get_main_queue() ^{ 
     [self performSelector:@selector(startNotePlay:) withObject:button afterDelay:1.5]; 
    }); 
}); 

無疑有更好的方式來實現自己的目標,但沒有更多的信息,即源代碼,很難提供一個更好的解決方案。