一 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
此方式在主线程和子线程中均可执行。
是一种阻塞的执行方式,建方放到子线程中,以免卡住界面
没有找到取消执行的方法。
- sleep方式
[NSThread sleepForTimeInterval:1.0f]; [self delayMethod];
- sleep方式
五 使用GCD
此方式在可以在参数中选择执行的线程。
是一种非阻塞的执行方式,
没有找到取消执行的方法。
void RunBlockAfterDelay(NSTimeInterval delay, void (^block)(void)){
dispatch_after(dispatch_time(DISPATCH_TIME_NOW,
NSEC_PER_SEC*delay),
dispatch_get_current_queue(), block);
}