2012-06-01 47 views
0

我有一个算法需要几秒钟来加载一些东西,我想先在标签上设置字符串以在实际加载开始之前说“加载”。这全部在同一层,这不是在场景之间切换。使用Cocos2D scheduleUpdate来延迟加载

我想我可以简单地这样做:

-(void)startLoading{ 

[self unscheduleAllSelectors];//just in case the update is already scheduled 

[self.loadingLabel setString:@"Loading...."]; 

[self scheduleUpdate]; 

} 

然后,我有这样的:

-(void)update:(ccTime)delta{ 
[self unscheduleUpdate]; 
[self beginLoading];//another method that loads all the stuff 

} 

我的理解是,我的方法不应该运行到下一帧。因此我的标签应该正确更新。但是,这没有发生。当我的所有资产都被加载并且我的标签在加载开始之前永远不会更新的时候,会有轻微的冻结。

我错过了一个步骤吗?

+0

你是从场景/图层中的init函数调用startLoading吗?此线程似乎有一个解决方案... http://www.cocos2d-iphone.org/forum/topic/15998 – badgerr

+0

该线程指的是一个不同的问题。我的更新正在运行,但它并未等待一帧,或者如果是这样,先前的帧在新帧开始之前没有完成,而我认为这是不可能的。我不是从init方法调用。 – johnbakers

回答

0

不能错过任何东西。我停止了与此战斗,现在使用这种'延迟'任务弹射器。它应该确保你会在从第一个到第二个tick的转换中得到一个平局:

-(void) startLoading{ 
    _loadTicker=0; // an NSUInteger iVar declared in the .h 
    [self schedule:@selector(tickOffLoading:)]; 
} 

-(void) tickOffLoading:(ccTime) dt{ 

    _loadTicker++; 
    if(_loadTicker==1) { 
     [self.loadingLabel setString:@"Loading...."]; 
    } else { 
     [self unschedule:@selector(tickOffLoading:)]; 
     [self beginLoading]; 
    } 
} 
+0

谢谢,你和我有类似的想法。我结束了仍然使用常规'更新'方法,但也使用帧计数器ivar – johnbakers

+0

@andrewx:lol,并不真正感到惊讶,类似的问题会产生类似的解决方案。这可以很好地为后台任务加载阶段,因为您可以将滚动条检查级联到1,2,3等... – YvesLeBorg

+0

我仍然想知道为什么它不像预期的那样工作。我猜更新必须在初始计划时运行在相同的“帧”或运行循环。 – johnbakers