objective-c – 如何创建一个“包裹”目标/选择对对的块?

前端之家收集整理的这篇文章主要介绍了objective-c – 如何创建一个“包裹”目标/选择对对的块?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我喜欢块,而且很酷.

然而,我发现块可能会混乱我的代码,使得读取更难,而不会将所有代码都放在Xcode中(我不喜欢这样做).

我喜欢将我的代码分解为逻辑方法(选择器)以使其更容易阅读,但它(表面上)显示出这样的框架,如dispatch,AFNetworking和其他几个不容易实现.

我也不在乎代理方式,这意味着我不能像我想要的那样命名我的方法,而是依靠别人认为我需要的方法.

所以,没有写一堆这样的胶水代码

-(void) reloadData { 
    ...
    [[EventsManager instance] data:YES async:^(NSArray *events) { [self processEvents:events] }];
    ...
}

我可以这样做:

-(void) reloadData {
    ...
    [[EventsManager instance] data:YES async:createBlock(self,@selector(processEvents:))];
    ...
}

哪个更容易阅读(对我来说)

有了我们用Objective-C的力量,它是运行时,这应该是可能的,不是吗?虽然我没有看到像这样的东西.

解决方法

我从学术角度喜欢你的答案; 1,显然,你学到了一些东西.

从实际的角度来看,似乎非常多的脆弱性,很少减少打字,同时也会导致呼叫站点的一些信息丢失.

这样做的好处是它是明确的:

-(void) reloadData { 
    ...
    [[EventsManager instance] data:YES async:^(NSArray *events) { [self processEvents:events] }];
    ...
}

读取,看到需要异步回调块来处理参数,并且processEvents:method on self将用于执行实际工作.

表达式createBlock(self,@selector(processEvents :))是相同的有损表示;它失去了回调的明确论证以及该参数和正在调用方法之间的映射(我经常看到回调块,如上所述,在调用方法之前有一些轻量级逻辑和/或参数处理).

还要注意,在调用时将非可变链接调用站点作为一个varargs进行处理是违反了C标准,并且在某些具有某些参数列表的ABI上不起作用.

猜你在找的C&C++相关文章