ios performSelector延迟调用及取消问题

iOS延迟调用NSObject提供的相关函数如下:


/**************** 	Delayed perform	 ******************/

@interface NSObject (NSDelayedPerforming)

- (void)performSelector:(SEL)aSelector withObject:(nullable id)anArgument afterDelay:(NSTimeInterval)delay inModes:(NSArray<NSRunLoopMode> *)modes;
- (void)performSelector:(SEL)aSelector withObject:(nullable id)anArgument afterDelay:(NSTimeInterval)delay;
+ (void)cancelPreviousPerformRequestsWithTarget:(id)aTarget selector:(SEL)aSelector object:(nullable id)anArgument;
+ (void)cancelPreviousPerformRequestsWithTarget:(id)aTarget;

@end

1、延迟执行函数

- (void)performSelector:(SEL)aSelector withObject:(nullable id)anArgument afterDelay:(NSTimeInterval)delay inModes:(NSArray<NSRunLoopMode> *)modes;
- (void)performSelector:(SEL)aSelector withObject:(nullable id)anArgument afterDelay:(NSTimeInterval)delay;

2、取消延迟函数

+ (void)cancelPreviousPerformRequestsWithTarget:(id)aTarget selector:(SEL)aSelector object:(nullable id)anArgument;
+ (void)cancelPreviousPerformRequestsWithTarget:(id)aTarget;
  • (void)cancelPreviousPerformRequestsWithTarget:(id)aTarget selector:(SEL)aSelector object:(nullable id)anArgument;
    这个函数可以取消带参数的延迟函数的调用;
  • (void)cancelPreviousPerformRequestsWithTarget:(id)aTarget;
    这个函数可以取消所有的延迟调用;

注意:

正常情况下相关API协调调用不会有什么问题,最近用cancelPreviousPerformRequestsWithTarget:取消performSelector:出来的函数时,出现了无法取消的问题,在网上搜了相关资料未找到不生效的情况;
后来经过调研,发现在执行cancelPreviousPerformRequestsWithTarget:API时,已经进入到子线程,后来切到主线程后一切OK!

- (void)cancelDealyThread
{
    dispatch_async(dispatch_get_main_queue(), ^{
        [NSObject cancelPreviousPerformRequestsWithTarget:self];
    });
}

发布了172 篇原创文章 · 获赞 35 · 访问量 39万+

猜你喜欢

转载自blog.csdn.net/u012198553/article/details/83096659