我喜欢块,而且很酷.
然而,我发现块可能会混乱我的代码,使得读取更难,而不会将所有代码都放在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上不起作用.