在执行之间暂停执行一个接一个的方法

时间:2012-11-14 09:11:04

标签: iphone objective-c ios xcode method-call

新手obj-c问题。 我正在写一个简单的iPad演示文稿而不是Appstore。我的任务是实现一个接一个地执行的几个方法,它们之间几乎没有暂停。主要结构如下:

  • 查看加载
  • 暂停两秒钟,然后执行method1
  • 暂停两秒钟,然后执行method2
  • 暂停两秒钟,然后执行method3 等...

我从-viewDidLoad调用的第一个方法:

NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(firstCountStarts) userInfo:nil repeats:NO];

此处一切正常,方法在视图加载后2秒开始。 从method1里面我尝试以相同的方式调用方法2,但它开始与method1同时执行。同样的方法触发了method3(从method2调用)以及它们之后根本没有执行的所有方法。我试图将所有这些方法放在-ViewDidLoad中,并用延迟来调用它们:

 [self method1];
 [self performSelector:@selector(method2) withObject:nil afterDelay:2];
 [self performSelector:@selector(method3) withObject:nil afterDelay:4];
 etc...

但是在method2调用所有方法之后没有执行。如果我理解线程中的问题。我是否需要使用GCD在不同的队列中执行方法?或者可能是其他问题?

谢谢,同事们!

2 个答案:

答案 0 :(得分:8)

您可以将这些添加到NSOperation队列......

NSOperationQueue *queue = [NSOperationQueue new];

queue.maxConcurrentOperationCount = 1;

[queue  addOperationWithBlock:^{
    [self method1];
}];

[queue  addOperationWithBlock:^{
    [NSThread sleepForTimeInterval:2.0];
    [self method2];
}];

[queue  addOperationWithBlock:^{
    [NSThread sleepForTimeInterval:2.0];
    [self method3];
}];

...

然后,只有在前一个完成后才会运行每一个,并为您提供2秒的延迟。

小心使用它来做UI的东西。这将在后台线程中运行,因此您可能需要处理它。

也许这可能会更好,你可以通过继承NSOperation来做到这一点,但这是很多工作没有太大的好处。

从你想要的地方运行它,我建议将所有这些放入一个名为setUpQueue的函数中。

然后从viewWillAppear或viewDidLoad或其他地方,按下按钮等...执行...

[self setUpQueue];

您只需要向队列中添加内容,然后队列将自行管理。

答案 1 :(得分:0)

您可以使用单个计时器,并按照要执行的顺序围绕要执行的方法编写switch语句。 e.g。

int turn = 0;
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(runmethod) userInfo:nil repeats:NO];

然后在run方法

switch(turn)
{
  case 0:
        // do method 1 stuff
        ++turn;
        break;
  case 1:
        // do method 2 stuff
        ++turn;
        break;
    .
    .
    .
}

NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(runmethod) userInfo:nil repeats:NO];