Подтвердить что ты не робот

Objective-C действие задержки с блоками

Я знаю, что существует несколько способов задержки действия в Objective-C, например:

performSelector:withObject:afterDelay:

или используя NSTimer.

Но есть такая причудливая вещь, называемая блоками, где вы можете сделать что-то вроде этого:

[UIView animateWithDuration:1.50 delay:0 options:(UIViewAnimationOptionCurveEaseOut|UIViewAnimationOptionBeginFromCurrentState) animations:^{

    }completion:^(BOOL finished){
}];

К сожалению, этот метод применяется только к анимации вещей.

Как создать задержку с блоком в одном методе, поэтому мне не нужно использовать все те @selectors и без необходимости создания нового отдельного метода? Спасибо!

4b9b3361

Ответ 1

использовать dispatch_after:

double delayInSeconds = 2.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
    //code to be executed on the main queue after delay
    [self doSometingWithObject:obj1 andAnotherObject:obj2];
});

Ответ 2

Развернувшись на принятом ответе, я создал функцию Helper для тех, кто не хочет запоминать синтаксис каждый раз, когда они хотят это сделать:) У меня просто есть класс Utils с этим:

Использование:

[Utils delayCallback:^{
     //--- code here
} forTotalSeconds:0.3];

Вспомогательный метод:

+ (void) delayCallback: (void(^)(void))callback forTotalSeconds: (double)delayInSeconds{

     dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
     dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
           if(callback){
                callback();
           }
      });
}

Ответ 3

Вот как вы можете запускать блок после задержки в Swift:

runThisAfterDelay(seconds: 4) { () -> () in
    print("Prints this 4 seconds later in main queue")
    // Or just call animatedMyObject() right here
}

/// EZSwiftExtensions
func runThisAfterDelay(seconds seconds: Double, after: () -> ()) {
    let time = dispatch_time(DISPATCH_TIME_NOW, Int64(seconds * Double(NSEC_PER_SEC)))
    dispatch_after(time, dispatch_get_main_queue(), after)
}

Он включен как стандартная функция в моем репо: https://github.com/goktugyil/EZSwiftExtensions