2014-03-01 123 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]; 
    }); 
}); 

无疑有更好的方式来实现自己的目标,但没有更多的信息,即源代码,很难提供一个更好的解决方案。