IOS dispatch_after的执行和取消

来源:互联网 发布:js获取table高度 编辑:程序博客网 时间:2024/05/20 00:39
// dispatch_after的执行
static PDDelayedBlockHandle perform_block_after_delay(CGFloat seconds, dispatch_block_t block) {      if (block == nil) {          return nil;      }            __block dispatch_block_t blockToExecute = [block copy];      __block PDDelayedBlockHandle delayHandleCopy = nil;            PDDelayedBlockHandle delayHandle = ^(BOOL cancel) {          if (!cancel && blockToExecute) {              blockToExecute();          }                    // Once the handle block is executed, canceled or not, we free blockToExecute and the handle.          // Doing this here means that if the block is canceled, we aren't holding onto retained objects for any longer than necessary.  #if !__has_feature(objc_arc)          [blockToExecute release];          [delayHandleCopy release];  #endif                    blockToExecute = nil;          delayHandleCopy = nil;      };      // delayHandle also needs to be moved to the heap.      delayHandleCopy = [delayHandle copy];            dispatch_after(dispatch_time(DISPATCH_TIME_NOW, seconds * NSEC_PER_SEC), dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{          if (nil != delayHandleCopy) {              delayHandleCopy(NO);          }      });            return delayHandleCopy;  }  

// dispatch_after的取消 
static void cancel_delayed_block(PDDelayedBlockHandle delayedHandle) {      if (nil == delayedHandle) {          return;      }            dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{          delayedHandle(YES);      });  }  

调用:
@property (nonatomic, assign) PDDelayedBlockHandle delayedBlockHandle;// 执行_delayedBlockHandle = perform_block_after_delay(秒数, ^{   // 执行内容   });  // 取消cancel_delayed_block(_delayedBlockHandle);

0 0
原创粉丝点击