e19*_*985 13 api objective-c objective-c-blocks
在ObjC中设计基于块的API时,哪种方法更好,一个或两个完成块,一个是成功还是失败?
假设我们有一个方法以异步方式检索某个块,其中一个完成块将是:
- (void) retrieveSomethingCompletion:(void (^)(id retrievedObject, NSError *error))completionBlock;
Run Code Online (Sandbox Code Playgroud)
并且有成功/失败块(AFNetworking样式):
- (void) retrieveSomethingSuccess:(void(^)(id retrievedObject))successBlock failure:(void(^)(NSError *error))failureBlock;
Run Code Online (Sandbox Code Playgroud)
我总是使用第二种方法,但每种方案的优缺点是什么?你通常使用什么,为什么?
bbu*_*bum 12
两者都是精美的模式(我赞成了Firo和John的答案,因为 - 是的,这是一个品味的问题,他们的答案都是现场的),但是在我的单个街区中,有几个明显的优点.经验.John Woods对API的"风味"提出了一个很好的观点,尽管我会声称网络操作总是完成(除非它没有超时,这是一个不同类的bug)并且成功/失败模式不是非常/或.
它消除了必须在块之间复制代码,这些代码在完成时拆除任务是常见的,无论成功或失败.
它在调度任务和知道任务何时完成之间提供单个概念执行流程. 完成此任务后,将调用完成块.
在某些情况下,失败实际上可能产生应该以成功路径的方式处理的数据.在较少的情况下,成功完成实际上可能会带来错误.虽然NSError**方法上的模式纯粹是/或,但使用任一块模式的优点之一是可以表达.使用单个完成块的另一个好处是可以避免重复的逻辑.
作为方法的参数的多个块是平坦的丑陋和烦人的.编码模式只有一个块传递给方法并始终使该块成为最后一个参数是有原因的.不幸的是,即使是系统API不能始终如一地遵循这种模式,虽然使用仅限大多到块往往是简单的情况.大多.
它避免了这样的废话:
[foo doSomething: ^{
.... lots of code ...
.... lots of code ...
.... lots of code ...
.... lots of code ...
.... lots of code ...
.... lots of code ...
.... lots of code ...
.... lots of code ...
.... lots of code ...
.... lots of code ...
.... lots of code ...
.... lots of code ...
.... lots of code ...
.... lots of code ...
.... lots of code ...
.... lots of code ...
.... lots of code ...
} andSomethingElse: ^{
.... lots of code ...
.... lots of code ...
.... lots of code ...
.... lots of code ...
.... lots of code ...
.... lots of code ...
.... lots of code ...
.... lots of code ...
.... lots of code ...
.... lots of code ...
.... lots of code ...
.... lots of code ...
.... lots of code ...
.... lots of code ...
.... lots of code ...
.... lots of code ...
.... lots of code ...
.... lots of code ...
}];
Run Code Online (Sandbox Code Playgroud)
我通常使用第二个实现.原因如下:
它更适合重复使用块.我经常对失败有相同的实现,所以我可以创建一个返回失败块的方法,并根据需要更改成功块.您可以使用第一个实现执行此操作,但是您需要嵌套块.
我希望在可能的情况下避免不必要的检查("如果错误然后对我的错误执行某些操作,否则对我的对象执行某些操作").由于我要么得到一个对象或一个错误(从来没有),我发现当只有一个参数有效时传递这两个参数是不方便的.
我使用Restkit,我只需要将块传递给我的API调用,当调用进来时它会自动调用成功或失败块.如果我做第二个实现,我需要处理方法回调(失败或成功方法/块)并手动执行块.我不确定AFNetworking.
我个人认为两者都很好但在这种情况下我会争论第二个.
| 归档时间: |
|
| 查看次数: |
1286 次 |
| 最近记录: |