美文网首页
iOS中的延迟执行和取消

iOS中的延迟执行和取消

作者: 里克尔梅西 | 来源:发表于2021-05-06 21:19 被阅读0次

iOS中的延迟执行,一般有三种方法:performSelector、NSTimer、dispatch_after

一、performSelector

  • 延迟方法:
[self performSelector:@selector(delay) withObject:nil afterDelay:3.0];
  • 取消延迟:

方法一:

[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(delay) object:nil];

*这里需要注意参数需要保持一致,否则取消失败。

方法二:可以取消所有的延迟调用

[NSObject cancelPreviousPerformRequestsWithTarget:self];
  • 遇到的问题:
    cancelPreviousPerformRequestsWithTarget不管用,计时依然存在,这是因为performSelector和cancelPreviousPerformRequestsWithTarget必须在同一个线程中执行才行
dispatch_async(dispatch_get_main_queue(),^{
    [NSObject cancelPreviousPerformRequestsWithTarget:self];
});

二、NSTimer

  • 延迟方法:
self.timer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(delay) userInfo:nil repeats:NO];
  • 取消方法:
[self.timer invalidate];
self.timer = nil;

NSTimer会有循环引用的问题,之后再慢慢补充

三、dispatch_after

dispatch_after能让我们添加进队列的任务延迟执行,该函数并不是在指定时间后执行处理,而只是在指定时间追加到自己需要的队列中去执行。

  • 方法定义:
/*
dispatch_time_t:时间参数
dispatch_queue_t:队列
dispatch_block_t:写入需要执行的操作
*/
dispatch_after(dispatch_time_t when, dispatch_queue_t queue,
        dispatch_block_t block);
  • 延迟执行:
dispatch_queue_t queue = dispatch_get_global_queue(0, 0);

//表示延迟2秒后执行
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), queue, ^{
        /*你的操作*/
    });

当然如果是主线程择将queue换成dispatch_get_main_queue()

  • 取消方法:暂时没有

四、sleepForTimeInterval

 [NSThread sleepForTimeInterval:5];

当然这个方法会阻塞主线程

相关文章

网友评论

      本文标题:iOS中的延迟执行和取消

      本文链接:https://www.haomeiwen.com/subject/xxxjdltx.html