调用延迟/休眠之间的方法

时间:2014-03-01 17:57:41

标签: ios multithreading ios7 nsobject

我正在为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];

这个问题是sleep关闭了主线程。因此,在睡眠发生时,我无法进行任何UI更改。

这两者之间有什么关系吗?无论如何,在没有关闭一切的情况下执行睡眠基本上就是这样。或类似的,执行此方法,然后在X延迟后执行该方法?

感谢您的帮助, 加布

2 个答案:

答案 0 :(得分:0)

如何执行一个选择器,然后在延迟后再执行另一个选择器?你知道那个人会在另一个之后离开吗? :)

否则,您可以使用timeIntervalSinceNow

在特定时间执行某个方法

答案 1 :(得分: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];
    });
});

毫无疑问,更好的方法可以实现您的目标,但如果没有更多信息,即源代码,很难提供更好的解决方案。