延迟执行

一 performSelector:withObject:afterDelay

  • 1.最直接的方法performSelector:withObject:afterDelay:
    这种方法的缺点:每次要为延时写一个方法

此方式要求必须在主线程中执行,否则无效。
是一种非阻塞的执行方式,
暂时未找到取消执行的方法。

  • 2.使用类别,用BOLCK执行
@implementation NSObject (PerformBlockAfterDelay) 
- (void)performBlock:(void (^)(void))block    afterDelay:(NSTimeInterval)delay {   
  [self performSelector:@selector(fireBlockAfterDelay:)              
                  withObject:block              
                   afterDelay:delay];
} 
- (void)fireBlockAfterDelay:(void (^)(void))block {   
 block();
}
  • 3.可能是不太好的方法,用animation的completion参数
[UIView animateWithDuration:0.0 delay:5.0 options:UIViewAnimationOptionAllowUserInteraction animations:^{} completion:^(BOOL finished) {  
  //do stuff here
}];

@end

三 NSTimer

  • 1.定时器:NSTimer

[NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(delayMethod) userInfo:nil repeats:NO];

此方式要求必须在主线程中执行,否则无效。
是一种非阻塞的执行方式,
可以通过NSTimer类的- (void)invalidate;取消执行。

四 Sleep

此方式在主线程和子线程中均可执行。
是一种阻塞的执行方式,建方放到子线程中,以免卡住界面
没有找到取消执行的方法。

    1. sleep方式
      [NSThread sleepForTimeInterval:1.0f]; [self delayMethod];

五 使用GCD

此方式在可以在参数中选择执行的线程。
是一种非阻塞的执行方式,
没有找到取消执行的方法。

void RunBlockAfterDelay(NSTimeInterval delay, void (^block)(void)){   
 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 
             NSEC_PER_SEC*delay),   
   dispatch_get_current_queue(), block);
}

你可能感兴趣的:(延迟执行)