正文
iOS 面试题(九):创建一个可以被取消执行的 block
原创
2017-01-08
唐巧
iOS开发by唐巧
问题
我们知道 block 默认是不能被取消掉的,请你封装一个可以被取消执行的 block wrapper 类,它的定义如下:
typedef void (^Block)();@interface CancelableObject : NSObject- (id)initWithBlock:(Block)block;- (void)start;- (void)cancel;@end
||||||||| 思考时间,想好了请往下翻答案。|||||||||
答案
这道题是从网上看到的,原题是创建一个可以取消执行的 block,我想到两种写法。
方法一:创建一个类,将要执行的 block 封装起来,然后类的内部有一个 _isCanceled
变量,在执行的时候,检查这个变量,如果 _isCanceled
被设置成 YES
了,则退出执行。
typedef void (^Block)();@interface CancelableObject : NSObject- (id)initWithBlock:(Block)block;- (void)start;- (void)cancel;@end@implementation CancelableObject { BOOL _isCanceled; Block _block;}- (id)initWithBlock:(Block)block { self = [super init]; if (self != nil) { _isCanceled = NO; _block = block; } return self;}- (void)start { __weak typeof(self) weakSelf = self; dispatch_async(dispatch_get_global_queue(0, 0), ^{ if (weakSelf) { typeof(self) strongSelf = weakSelf; if (!strongSelf->_isCanceled) { (strongSelf->_block)(); } } });}- (void)cancel { _isCanceled = YES;}@end