iOS中的延迟执行

总结一下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];

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