我有两种方法都可以创建一个随机精灵节点并将其添加到场景中。我们称他们为spriteMethod1
和spriteMethod2
。
我想要一个循环方法,运行spriteMethod1
,5 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];
}
答案 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];