iOS中的延迟执行
2017-04-29 本文已影响0人
一分钟科普
总结一下iOS中常用的集中延迟执行的方案:
GCD dispatch_after函数
可以实现延时为某个队列中添加任务,并且允许在其他线程执行,不会阻塞线程.要注意的是,在任务块中使用self时,要用weak转换.不然容易泄漏.
__weak typeof(self) weakSelf = self;
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_global_queue(0, 0), ^{
NSLog(@"%@",[NSThread currentThread]);
[self action];
});
NSObject的 - (void)performSelector: withObject: afterDelay: 方法
不会阻塞主线程,当延时方法未执行时,方法调用者会被强引用,所以在某些场景下,需要将延时操作取消.
有两种常用的取消方式
- 取消时的参数与执行时的参数要一致,用于取消特定延时操作
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(action) object:nil];
- 取消target中所有延时操作
[NSObject cancelPreviousPerformRequestsWithTarget:self];
NSTimer
这个就比较常用了,创建timer,加入runloop
self.timer = [NSTimer scheduledTimerWithTimeInterval:3 target:self selector:@selector(action) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSDefaultRunLoopMode];
记得在需要时进行作废操作,将timer移出runloop,否则容易发生内存泄漏.
[self.timer invalidate];