RTBlockCallChecker 0.1.1

RTBlockCallChecker 0.1.1

Ricky Tan 维护。



  • 作者:
  • rickytan

RTBlockCallChecker

CI Status Version License Platform

简介

有时,作为第三方库,我们必须确保向开发者传递的完成块必须被调用,否则将导致错误和未预期的状态。例如,在 WebKit 中,我们有一个导航代理方法

- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler;

如果因为某种原因开发者忘记了调用 decisionHandler,这是不允许的。实际上,如果你忘记了调用它,WebKit 将为你抛出异常。那么 WebKit 是怎么做到这一点的呢?它通过在 CPP 中实现 CompletionHandlerCallChecker 来进行操作,并使用 lambda 表达式。但是这个项目在 Objective-C 中提供了一个奇妙的解决方案。更多详细信息,请阅读源代码,相当简单。

使用方法

RTBlockCallChecker 通过 CocoaPods 提供。要安装它,只需在您的 Podfile 中添加以下行:

pod 'RTBlockCallChecker'
void (^someBlockMustBeCalled)() = ^{
   ...
};
// change
[self passBlockToAMethod:someBlockMustBeCalled];
// to
[self passBlockToAMethod:RT_CHECK_BLOCK_CALLED(someBlockMustBeCalled)];
// simple!

- (void)passBlockToAMethod:(void(^)(void))block {
    // 1. call the block immediatedlly
    block();        // ok
    // 2. call the block with delay
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        block();    // ok
    });
    // 3. pass the block to another instance, and it will call the block in the future
    someObj.completion = block; // ok
    // 4. forget to call the block, raise an exception!
}

作者

rickytan,[email protected]

版权声明

RTBlockCallChecker遵循MIT许可协议。更多信息请参阅LICENSE文件。