专栏名称: Adrenine
iOS开发
目录
相关文章推荐
51好读  ›  专栏  ›  Adrenine

iOS 面试题(九):创建一个可以被取消执行的 block

Adrenine  · 掘金  ·  · 2017-12-13 08:46

正文

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







请到「今天看啥」查看全文


推荐文章
中国经济网  ·  定了!未来五年,这才是“金饭碗”!
8 年前
肌肉男训练营  ·  一名高级私人教练给的12条减脂建议
8 年前
硕士博士读书会  ·  为什么最近几天大家都在疯传这两张图?
8 年前
儿童摄影引导技巧  ·  给孩子拍照的小窍门 让你拍到爽!
7 年前