Вызов действия через определенные промежутки времени в iOS

Я пытаюсь вызвать функцию, содержащую ccactioninterval в Cocos3d. Я хочу вызывать эту функцию через определенные промежутки времени. Когда я попробовал NSTimer , я обнаружил, что иногда она работает, а иногда нет.

      NSTimer makeTarget=[NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(createTargets) userInfo:nil repeats:YES];

Здесь createTargets — это функция, содержащая события действий. когда я запускаю функцию прямо, она отлично работает один раз. Проблема возникает, когда я пытаюсь запланировать это. Я пробовал различные методы, которые уже объяснялись для связанных вопросов. Но у меня ничего не получалось. . . .

Вот код

-(void) addTargets {      
    NSTimer *makeTarget = [NSTimer scheduledTimerWithTimeInterval:2.0
              target:self selector:@selector(createTargets) userInfo:nil repeats:YES]; 
}

-(void)createTargets {
    CC3MeshNode *target = (CC3MeshNode*)[self getNodeNamed: @"obj1"];    
    int minVal=-5;
    int maxVal=5;    
    float avgVal; 
    avgVal = maxVal- minVal;      
    float Value = ((float)arc4random()/ARC4RANDOM_MAX)*avgVal+minVal ;          
    [target setLocation:cc3v(Value, 5.0, 0.0)];    
    CCActionInterval *moveTarget = [CC3MoveBy actionWithDuration:7.0 moveBy:cc3v(0.0, -10.0, 0.0)];     
    CCActionInterval *removeTarget = [CCCallFuncN actionWithTarget:self selector:@selector(removeTarget:)];       
    [target runAction:[CCSequence actionOne:moveTarget two:removeTarget]];   
}

-(void)removeTarget:(CC3MeshNode*)targ {  
    [self removeChild:targ];  
    targ=nil; 
}

person Karan Alangat    schedule 22.06.2013    source источник
comment
Что еще вы пробовали и что не сработало. Вы пробовали CCTimer?   -  person Wain    schedule 22.06.2013
comment
Я пробовал планировщик и cctimer. звонок был сделан, но действие не выполнено   -  person Karan Alangat    schedule 27.06.2013
comment
Если вызов сделан, но действия не выполняются, я бы сказал, что проблема связана с действиями, покажите этот код.   -  person Wain    schedule 27.06.2013
comment
Я использовал arc4random, чтобы установить местоположение моего меш-узла. Функция removeTarget содержит код для удаления meshnode.   -  person Karan Alangat    schedule 27.06.2013
comment
Вы отладили метод, чтобы проверить, найден ли target?   -  person Wain    schedule 27.06.2013
comment
Я дал счетчик в этом методе и обнаружил, что он постоянно увеличивается. Так что счетчик работает нормально. Когда я запускаю, я могу c двигаться только один меш-узел, и через определенные промежутки времени появляется другой узел.   -  person Karan Alangat    schedule 27.06.2013
comment
@KaranAlangat Пожалуйста, отредактируйте свой вопрос, чтобы включить его. 1) Ваша реализация метода createTargets (+ любой другой соответствующий код, который он вызывает). 2) Какие именно части кода вызываются, а какие нет (используйте NSLogs). 3) Каковы ваши симптомы. 4) Контекст создания вашего NSTimer (вы создаете несколько таймеров?)   -  person Robert    schedule 02.07.2013
comment
Я считаю, что код говорит все   -  person Karan Alangat    schedule 05.07.2013


Ответы (1)


Без большого количества кода трудно сказать, в чем проблема, но вот некоторые вещи, которые стоит попробовать, извините, если что-то из этого очевидно.


У вас есть ссылка на таймер?

Это может быть полезно для отладки. Если у вас есть свойство с именем makeTargetTimer, вы можете сделать это:

NSTimer * makeTargetTimer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(createTargets) userInfo:nil repeats:YES];
self.makeTargetTimer = makeTargetTimer // Save to a property for later use (or just use an iVar)

Единственный способ остановить повторяющийся таймер — это аннулировать его. Поэтому вы можете проверить, не было ли оно признано недействительным.

BOOL isInvalidated = [self.makeTargetTimer isValid];

Также вы можете сделать это в своем методе Dealloc:

- (void) dealloc {
    [_makeTargetTimer invalidate];  // Stops the timer from firing (Assumes ARC)
}

Прокручиваете ли вы, когда должно быть получено четное?

Если вы хотите, чтобы таймер срабатывал во время прокрутки, вам нужно использовать NSRunLoopCommonModes. В этом вопросе есть отличное объяснение.

 [[NSRunLoop currentRunLoop] addTimer:makeTargetTimer forMode:NSRunLoopCommonModes]; 

Какова ваша реализация createTargets?

  • Поместили ли вы операторы NSLog в тело этого метода. Вы уверены, что его не вызывают?
person Robert    schedule 25.06.2013
comment
Спасибо за ваш ответ . У меня проблема, связанная с действием. Я дал функцию для вызова. Эта функция создает меш-узел и назначает действие для выполнения. Я хочу, чтобы этот узел с указанными действиями через определенные промежутки времени - person Karan Alangat; 27.06.2013
comment
Мой код был предоставлен в качестве комментария @ Wain. Пожалуйста, взгляните на это - person Karan Alangat; 27.06.2013