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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章