2015-04-06 4 views
2

я 3 условия должны быть реализованы следующим образом,Как вызвать метод с возвратом типа BOOL после Delay?

if(condition 1) 
{ 
    return true; 
} 
else 
{ 
    if(condition 2) 
    { 
     //after 10 sec delay call condition 3 which will return BOOL value 
     retutn that BOOL value after 10 sec 
    } 
    else 
    { 
    return false; 
    } 
} 

Как получить значение BOOL в качестве типа возвращаемого значения после задержки?

+0

в этом случае пробег все это состояние после задержки. – Rajesh

+0

Я не вижу причин ждать 10 секунд во всех случаях, если есть хотя бы 2 из 3 условий, где вы можете сразу получить результат. –

ответ

3

Самый простой подход, который я могу придумать, - использовать blocks. Объявить метод, как это:

-(void)methodWithDelay:(void(^)(BOOL result))aCompletion 
{ 
    if(condition 1) 
    { 
     aCompletion(YES); 
    } 
    else 
    { 
     if(condition 2) 
     { 
      //after 10 sec delay call condition 3 which will return BOOL value 
      dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(10.f * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 
       aCompletion(YES/NO); 
      }); 
     } 
     else 
     { 
      aCompletion(NO); 
     } 
    } 
} 

И затем использовать его как это:

[self methodWithDelay:^(BOOL result) { 

    //do what you want with the result 

}]; 

Пожалуйста, обратите внимание на представленную документацию о блоках, и как избежать проблем с памятью с ними.

0

Вы можете добавить такой код:

dispatch_time_t x = dispatch_time(DISPATCH_TIME_NOW, 10.f * NSEC_PER_SEC); 

Так что это будет задерживать его на 10 секунд.

0

Вы можете вернуть BOOL после некоторой задержки с помощью GCD API dispatch_after, который принимает время задержки, очередь и имеет обработчик завершения, в котором вы можете выполнить код, который необходимо выполнить после истечения указанной продолжительности задержки.

Foe пример -

if(condition 1) 
{ 
    return true; 
} 
else 
{ 
    if(condition 2) 
    { 
     //after 10 sec delay call condition 3 which will return BOOL value 
     //retutn that BOOL value after 10 sec 
     double delayInSeconds = 10.0; 
     dispatch_time_t delayTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC)); 
        dispatch_after(delayTime, dispatch_get_main_queue(), ^(void){ 
         return YES;//return NO; 
        }); 

    } 
    else 
    { 
    return false; 
    } 
} 
+0

Когда я пытаюсь реализовать это, я получаю сообщение об ошибке: Несовместимые типы указателей блоков передают 'BOOL' параметру type 'dispatch_block_t' (aka 'void (^) (void')) –

0

Вы можете использовать таймер обратного отсчета времени, так что это не повлияет на ваш UI и после задержки, это будет вызывать метод «callYourBooleabMethod()» на onFnished.

 new CountDownTimer(DELAY,Interval) { 
      @Override 
      public void onTick(long millisUntilFinished) { 

      } 

      @Override 
      public void onFinish() { 
       callYourBooleabMethod(); 
      } 
     }.start(); 
Смежные вопросы