基 础 知 识(9)

  

接下来要讨论的是,如何使这些被调度的方法不再被调用。可以通过取消调度做到这一点。

要使节点中所有用选择器选定的方法(包括使用scheduleUpdate指定的方法)停止,可使用:

 

[self unscheduleAllSelectors];

 

要使某个用特定选择器选定的方法停止(假设选择器名为“updateTenTimesPerSecond:”),可使用:

 

[self unschedule:@selector(updateTenTimesPerSecond:)];

 

注意,该做法不会令使用scheduleUpdate指定的更新方法停止。

关于如何使用选择器来进行调度或者取消调度,这里有一个很有用的小窍门。很多时候,可能需要在一个被调度的方法中取消对某个方法的调用,但是因为自定义方法可能会被改名,所以不想在这里重复具体的方法名和参数个数。下面演示如何用选择器对一个方法进行调度,并在第一次调用后取消调度:

 

-(void) scheduleUpdates

{

    [self schedule:@selector(tenMinutesElapsed:) interval:600];

}

 

-(void) tenMinutesElapsed:(ccTime)delta

{

    // unschedule the current method by using the _cmd keyword

    [selfunschedule:_cmd];

}

此处的关键字_cmd是当前方法的快捷表达方式。这种方法可以有效地使tenMinutesElapsed方法不再被调用。事实上,也可以用_cmd来执行调度。假设现有一个方法,你需要以不同的时间间隔调用它,那么可以使用如下代码来完成:

 

-(void) scheduleUpdates

{

// schedule the first update as usual

[self schedule:@selector(irregularUpdate:) interval:1];

}

 

-(void) irregularUpdate:(ccTime)delta

{

// unschedule the method first

[self unschedule:_cmd];

 

// I assume you’d have some kind of logic other than random to determine

// the next time the method should be called

float nextUpdate = CCRANDOM_0_1() * 10;

 

// then re-schedule it with the new interval using _cmd as the selector

[self schedule:_cmdinterval:nextUpdate];

}

读书导航