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