接下来要讨论的是,如何使这些被调度的方法不再被调用。可以通过取消调度做到这一点。
要使节点中所有用选择器选定的方法(包括使用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];
}