.h
typedef
void(^DelayedBlockHandle)(BOOL cancel
);
DelayedBlockHandle perform_block_after_delay(CGFloat seconds
, dispatch_block_t block
);
void
cancel_delayed_block(DelayedBlockHandle delayedHandle
);
.m
DelayedBlockHandle perform_block_after_delay(CGFloat seconds
, dispatch_block_t block
) {
if (nil == block
) {
return nil;
}
__block dispatch_block_t blockToExecute
= [block copy
];
__block
DelayedBlockHandle delayHandleCopy
= nil;
DelayedBlockHandle delayHandle
= ^(BOOL cancel
){
if (NO == cancel
&& nil != blockToExecute
) {
dispatch_async(dispatch_get_main_queue(), blockToExecute
);
}
#
if !__has_feature(objc_arc
)
[blockToExecute release
];
[delayHandleCopy release
];
#endif
blockToExecute
= nil;
delayHandleCopy
= nil;
};
delayHandleCopy
= [delayHandle copy
];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, seconds
* NSEC_PER_SEC), dispatch_get_main_queue(), ^{
if (nil != delayHandleCopy
) {
delayHandleCopy(NO);
}
});
return delayHandleCopy
;
};
void
cancel_delayed_block(DelayedBlockHandle delayedHandle
) {
if (nil == delayedHandle
) {
return;
}
delayedHandle(YES);
}
调用
@property
(nonatomic
, assign
) DelayedBlockHandle delayedBlockHandle
;
_delayedBlockHandle
= perform_block_after_delay(秒数
, ^{
});
取消
cancel_delayed_block(_delayedBlockHandle
);
转载请注明原文地址: https://lol.8miu.com/read-16697.html