2

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

  • 查看负载
  • 暂停两秒,然后执行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 来执行不同队列中的方法吗?或者可能在其他方面有问题?

谢谢各位同事!

4

2 回答 2

9

您可以将这些添加到 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];

您所要做的就是将东西添加到队列中,然后队列将自行管理。

于 2012-11-14T09:18:50.540 回答
0

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

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

然后在运行方法中

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];
于 2015-01-17T03:09:20.967 回答