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];

[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];

上一篇 下一篇

猜你喜欢

热点阅读