Objective C - 多次运行方法,完成后再运行另一种方法

时间:2014-02-20 20:47:34

标签: ios objective-c sprite-kit

我有两种方法都可以创建一个随机精灵节点并将其添加到场景中。我们称他们为spriteMethod1spriteMethod2

我想要一个循环方法,运行spriteMethod15 times,然后spriteMethod2一次。每次调用spriteMethods之间也需要有延迟。

我认为以下内容可能有效,但事实并非如此:

-(void) addObjects {
    for (int i = 0; i < 5; i++) {
        [self performSelector:@selector(spriteMethod1) withObject:nil afterDelay:2];
    }
    [self performSelector:@selector(spriteMethod2) withObject:nil afterDelay:3];
    [self performSelector:@selector(addObjects) withObject:nil afterDelay:5];
}

5 个答案:

答案 0 :(得分:1)

我知道这可能不是最好的解决方案,但它对我有用:

-(void)addObjects {
    [self performSelector:@selector(spriteMethod1) withObject:nil afterDelay:2];
    [self performSelector:@selector(spriteMethod1) withObject:nil afterDelay:4];
    [self performSelector:@selector(spriteMethod1) withObject:nil afterDelay:6];
    [self performSelector:@selector(spriteMethod1) withObject:nil afterDelay:8];
    [self performSelector:@selector(spriteMethod1) withObject:nil afterDelay:10];
    [self performSelector:@selector(spriteMethod2) withObject:nil afterDelay:13];
    [self performSelector:@selector(addObjects) withObject:nil afterDelay:18];
}

答案 1 :(得分:1)

在界面中添加计时器:

@property (nonatomic, weak) NSTimer *timer;

在代码中的某处安排计时器

self.timer = [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(spriteMethod1) userInfo:nil repeats:YES];

这样做

int count = 0;

- (void)spriteMethod1 {
        count ++;
        // do your work here

        if(count == 5) {
            // stop the timer
            [self.timer invalidate];

            // call the other methods
            [self performSelector:@selector(spriteMethod2) withObject:nil afterDelay:3];
            [self performSelector:@selector(addObjects) withObject:nil afterDelay:5];
        }
    }

答案 2 :(得分:0)

问题是你不会看到延迟,因为选择器在线程循环中排队。来自documentation

  

此方法设置一个计时器来执行aSelector消息   当前线程的运行循环。计时器配置为在。中运行   默认模式(NSDefaultRunLoopMode)。当计时器触发时,线程   尝试从运行循环中取消消息并执行   选择。如果运行循环正在运行并且在默认情况下,它会成功   模式;否则,计时器等待直到运行循环处于默认状态   模式。

另一种方法是让线程休眠几秒钟。

[self spriteMethod1];
[NSThread sleepForTimeInterval:2.0f];

在这种情况下,如果不在单独的线程中执行此代码,则用户界面将挂起。

答案 3 :(得分:0)

这是我的头脑..不确定它是否会起作用:

- (void)startAddingObjects 
{
    NSNumber *counter = @(0);
    [self performSelector:@selector(addMoreUsingCounter:) 
               withObject:counter 
               afterDelay:2];
}

- (void)addMoreUsingCounter:(NSNumber *)counter
{
    int primCounter = [counter intValue];
    if (primCounter < 5)
    {
        [self spriteMethod1];
        [self performSelector:@selector(addMoreUsingCounter:) 
                   withObject:@(primCounter++) 
                   afterDelay:2];
    }
    else if (primCounter < 7)
    {
        [self spriteMethod2];
        [self performSelector:@selector(addMoreUsingCounter:) 
                   withObject:@(primCounter++) 
                   afterDelay:3];
    }
}

您可能仍需要将延迟与计数器联系起来,以获得所需的确切结果。

答案 4 :(得分:0)

我认为你的版本不起作用,因为“afterDelay”参数是相对于调用的时刻。您需要在for循环中将它与“i”相乘,然后分别对最后两个选择器使用13和18。

考虑使用NSOperationQueue。您可以将其maxConcurrentOperationCount设置为1,以确保它按顺序执行其操作。例如。

NSOperationQueue * opQueue = [[NSOperationQueue alloc] init];
opQueue.maxConcurrentOperationCount = 1; // this ensures it'll execute the actions sequentially

NSBlockOperation *spriteMethod1Invoker = [NSBlockOperation blockOperationWithBlock:^{
    for (int i = 0; i < 5; ++i)
    {
        [self spriteMethod1];
        sleep(2);  // sleep 2 secs between invoking spriteMethod1 again
    }
}];

NSInvocationOperation *spriteMethod2Invoker = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(spriteMethod2) object:nil];
[opQueue addOperation:spriteMethod1Invoker];
[opQueue addOperation:spriteMethod2Invoker];