接下來要討論的是,如何使這些被調(diào)度的方法不再被調(diào)用??梢酝ㄟ^取消調(diào)度做到這一點(diǎn)。
要使節(jié)點(diǎn)中所有用選擇器選定的方法(包括使用scheduleUpdate指定的方法)停止,可使用:
[self unscheduleAllSelectors];
要使某個(gè)用特定選擇器選定的方法停止(假設(shè)選擇器名為“updateTenTimesPerSecond:”),可使用:
[self unschedule:@selector(updateTenTimesPerSecond:)];
注意,該做法不會(huì)令使用scheduleUpdate指定的更新方法停止。
關(guān)于如何使用選擇器來進(jìn)行調(diào)度或者取消調(diào)度,這里有一個(gè)很有用的小竅門。很多時(shí)候,可能需要在一個(gè)被調(diào)度的方法中取消對(duì)某個(gè)方法的調(diào)用,但是因?yàn)樽远x方法可能會(huì)被改名,所以不想在這里重復(fù)具體的方法名和參數(shù)個(gè)數(shù)。下面演示了如何用選擇器對(duì)一個(gè)方法進(jìn)行調(diào)度,并在第一次調(diào)用后取消調(diào)度:
-(void) scheduleUpdates
{
[self schedule:@selector(tenMinutesElapsed:) interval:600];
}
-(void) tenMinutesElapsed:(ccTime)delta
{
// unschedule the current method by using the _cmd keyword
[selfunschedule:_cmd];
}
此處的關(guān)鍵字_cmd是當(dāng)前方法的快捷表達(dá)方式。這種方法可以有效地使tenMinutesElapsed方法不再被調(diào)用。事實(shí)上,也可以用_cmd來執(zhí)行調(diào)度。假設(shè)現(xiàn)有一個(gè)方法,你需要以不同的時(shí)間間隔調(diào)用它,那么可以使用如下代碼來完成:
-(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];
}