2014-08-30 2 views
2

Я использую следующий метод, который вызывается нажатием кнопки через построитель спрайтов.Кнопка «отключить» -> до завершения операции

- (void)method { 

//static dispatch_once_t pred; // 
//dispatch_once(&pred, ^{   // run only once code below 

[self performSelector:@selector(aaa) withObject:nil afterDelay:0.f]; 
[self performSelector:@selector(bbb) withObject:nil afterDelay:1.f]; 
[self performSelector:@selector(ccc) withObject:nil afterDelay:1.5f]; 
[self performSelector:@selector(ddd) withObject:nil afterDelay:4.f]; 
[self performSelector:@selector(eee) withObject:nil afterDelay:4.5f]; 

CCLOG(@"Received a touch"); 

//}); //run only once code above 

} 

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

заранее.

ответ

1

Добавить переменную экземпляра BOOL, которая служит в качестве знака того, происходит ли это действие. Как только начнется метод, отметьте флаг. Если вам нужно выполнить, установите флаг.

Добавить еще один performSelector:withObject:afterDelay:, который вызывает метод сброса флага обратно.


@implementation SomeClass { 
    BOOL _onceAtATime; 
} 

- (void)method { 
    @synchronized(self) { 
     if (!_onceAtATime) { 
      _onceAtATime = YES; 

      // do all the stuff you need to do 

      [self performSelector:@selector(resetOnceAtATime) 
         withObject:nil 
         afterDelay:delay]; 
      // where delay is sufficiently long enough for all the code you 
      // are executing to complete 
     } 
    } 
} 

- (void)resetOnceAtATime { 
    _onceAtATime = NO; 
} 

@end 
+0

вы можете мне точку в правильном направлении, чтобы читать литературу для этого. я просто не вижу этого. Благодарю. – user2800989

+0

@ user2800989 Я добавил пример. – nhgrif

+0

спасибо вам ответ. это очень помогло. У меня есть еще один вопрос, если у вас есть время. вместо использования afterDelay, как я могу его сбросить, только когда сцена перезагружается. то есть. если пользователь перешел на следующую сцену и решил вернуться к этому? – user2800989

0

Более простой способ будет использовать серийный NSOperationQueue как таковой (в Swift):

class ViewController: UIViewController { 

    let queue: NSOperationQueue 

    required init(coder aDecoder: NSCoder) { 
     queue = NSOperationQueue() 
     queue.maxConcurrentOperationCount = 1 
     super.init(coder: aDecoder) 
    } 

    @IBAction func go(sender: AnyObject) { 
     if (queue.operationCount == 0) { 
      queue.addOperationWithBlock() { 
       // do the first slow thing here 
      } 
      queue.addOperationWithBlock() { 
       // and the next slow thing here 
      } 
      // ..and so on 
     } 
     else { 
      NSLog("busy doing those things") 
     } 
    } 
} 
+0

спасибо. Я еще не стал двигаться дальше. но я ОПРЕДЕЛЕННО держу это в своих заметках! – user2800989

+0

Да, это стильный способ сделать это. – augustzf

Смежные вопросы