@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
performSeletor 能够在运行时根据传入的selector(方法子)调用方法,而且支持delay 一定时间后调用。
而且通过performSelector注册的方法还可以通过cancelPreviousPerformRequestsWithTarget取消执行。
(dispatchAfter 同样可以在指定一定之间后进行方法调用,但是想要取消方法调用则没有那么容易(有知道的同学请回复告知3q))。
在使用的时候有一点需要注意:传入的参数和selector要保持一致才能取消延迟方法调用。
先来一组有参数的对比:
[self performSelector:@selector(excuteWithParams) withObject:@"userid" afterDelay:3.0];
// 可以取消
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(excuteWithParams) object:@"userid"];
// 可以取消
[[self class] cancelPreviousPerformRequestsWithTarget:self selector:@selector(excuteWithParams) object:@"userid"];
// 不能取消 因为参数不一致
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(excuteWithParams) object:@"USERID"];
// 可以取消 (这个功能比较强大)
[NSObject cancelPreviousPerformRequestsWithTarget:self];
// 可以取消
[[self class] cancelPreviousPerformRequestsWithTarget:self];
没有参数的和有参数的类似:
[self performSelector:@selector(excuteWithoutParams) withObject:nil afterDelay:3.0];
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(excuteWithoutParams) object:@"userid"]; // 不能取消 多了参数
// 可以取消
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(excuteWithoutParams) object:nil];
以下这两个方法功能比较强大可以取消注册在target上的方法。 如同:
[[NSNotificationCenter defaultCenter] removeObserver:self]; 功能。
// 可以取消 (这个功能比较强大)
[NSObject cancelPreviousPerformRequestsWithTarget:self];
// 可以取消
[[self class] cancelPreviousPerformRequestsWithTarget:self];
其实总结起来就是:selector和params一定要保持一致,或者直接用 [NSObject cancelPreviousPerformRequestsWithTarget:self] 取消所有延迟方法的调用。