ios取消延迟方法调用之performSelector与cancelPreviousPerformRequestsWithTarget

@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] 取消所有延迟方法的调用。

转载于:https://my.oschina.net/zhxx/blog/832654

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值