вызовите метод один раз из другого метода, на котором есть CADisplayLink

Я хотел бы вызвать из метода «метод1» другой метод «метод2». Проблема в том, что есть CADisplayLink на «method1», и когда я хочу вызвать «method2» из «method1», он вызывает его со скоростью 6Ofps, то есть 60 раз в секунду, но я просто хочу, чтобы он вызывал его один раз. Я знаю, что мне нужно использовать переменную BOOL, но я не знаю, как их использовать. Может кто-нибудь помочь мне ? извините за мой английский, я французский :/

// РЕДАКТИРОВАТЬ: в методе 1 есть CADisplayLink:

-(void)method1{
if(
if ( leScore % 20000 == 0) {
[self method2];

}

-(void)method2{

etatJeu = arc4random() / (UINT_MAX/3);

switch(etatJeu) {
    case 0: /* top */
        etatJeu=kEtatJeu2;
        break;
    case 1: /* bottom */
        etatJeu=kEtatJeu3;              
        break;
    case 2: /* bottom */
        etatJeu=kEtatJeu4;              
        break;
    default:
        break;


}

поэтому каждый раз, когда 'leScore % 20000 == 0' вызывается один раз method2.


person jean bernard    schedule 11.11.2011    source источник


Ответы (2)


Если вы хотите, чтобы вызов метода происходил только один раз, используйте логическое значение следующим образом:

@interface SomeClass {
    BOOL method2RunFlag; // set to NO in init
}
@end

// ... in your method1

if( method2RunFlag == NO ) {
    // call your method2
    method2RunFlag = YES;
}

На основе вашего отредактированного кода выше:

-(void)method1{
if( method2RunFlag == NO ) {
method2RunFlag = YES;
  if ( leScore % 20000 == 0) {
    [self method2];
  }
    // wait 1 second before able to call again
    [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(resetMethod2RunFlag:) userInfo:nil repeats:NO];
}
- (void)resetMethod2RunFlag:(NSTimer *)timer {
  method2RunFlag = NO;
}

Все еще не совсем уверен, что вам нужно, но это мое лучшее предположение. знак равно

person TigerCoding    schedule 11.11.2011
comment
Нет, не один раз, потому что я хотел бы назвать это в другой раз. И с твоим способом я не могу назвать это другим разом :/ - person jean bernard; 12.11.2011
comment
Если вы хотите вызвать его позже, вы можете установить для BOOL значение NO, и это позволит запустить его снова. Или, может быть, я не понимаю, что именно вы хотите сделать? - person TigerCoding; 12.11.2011
comment
Но как я могу установить его в НЕТ. Потому что я установил в методе ДА. Должен ли я указать YES в методе после установки NO - person jean bernard; 12.11.2011
comment
Альтернативой является использование счетчика. Замените BOOL целочисленным значением, которое вы увеличиваете каждый раз, когда вызывается method1. Затем вы можете проверить, превышает ли это значение (x), запустить метод2, если это так, сбросить счетчик на ноль и дождаться его повторного вызова. - person TigerCoding; 12.11.2011
comment
Хм, это немного сложно для меня, не могли бы вы объяснить больше с кодом, пожалуйста? - person jean bernard; 12.11.2011
comment
Можете ли вы опубликовать часть своего кода здесь? В частности, сигнатуры методов (как я создал выше) и когда вам нужно их вызывать? - person TigerCoding; 12.11.2011

Вы, вероятно, захотите создать 2 варианта метода1, один для использования с CADisplayLink, другой где-то еще, возможно, вызывая весь общий код во вспомогательном методе1А, но с параметром флага, указывающим, следует ли вызывать метод2 или нет.

person hotpaw2    schedule 11.11.2011