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