gpt4 book ai didi

objective-c - 我的基于 block 的 API 应该只包含完成处理程序还是同时包含成功和失败处理程序?

转载 作者:太空狗 更新时间:2023-10-30 03:20:14 25 4
gpt4 key购买 nike

在 ObjC 中设计基于 block 的 API 时,哪种方法更好,一个完成 block 还是两个,成功和失败各一个?

假设我们有一种方法可以将某些内容异步检索到一个 block ,其中一个完成 block 将是:

- (void) retrieveSomethingCompletion:(void (^)(id retrievedObject, NSError *error))completionBlock;

还有成功/失败模块(AFNetworking 风格):

- (void) retrieveSomethingSuccess:(void(^)(id retrievedObject))successBlock failure:(void(^)(NSError *error))failureBlock;

我总是使用第二种方法,但每种方法的优缺点是什么?你平时用什么,为什么?

最佳答案

两者都是很好的模式(我对 Firo 和 John 的答案投了赞成票,因为——是的,这是一个品味问题,他们的答案都很准确),但是使用单个 block 有几个明显的优势, 在我的经验中。 John Woods 就 API 的“风格”提出了一个很好的观点,尽管我会声称网络操作总是完成(除非它没有超时,这是不同类别的错误)并且成功/失败模式通常不是非此即彼。

  • 它消除了在 block 之间重复代码的情况,这对于在完成时拆除任务很常见,无论成功或失败。

  • 它在安排任务和知道任务何时完成之间提供了一个单一的概念性执行流程。 当此任务完成时,将调用完成 block 。

  • 在某些情况下,失败实际上可能会产生应该以与成功路径类似的方式处理的数据。在少数情况下,成功完成实际上可能会带来错误。虽然方法上的 NSError** 模式纯粹是非此即彼,但使用任一 block 模式的优点之一是可以表达这一点。使用单个完成 block 的进一步优势是您可以避免重复的逻辑。

  • 将多个 block 作为方法的参数非常丑陋且令人讨厌。编码模式只将一个 block 传递给方法并始终使该 block 成为最后一个参数是有原因的。不幸的是,即使是系统 API 也不会始终遵循这种模式,尽管使用仅限于主要 block 往往很简单的情况。大多数情况下。

它避免了这样的废话:

 [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 ...
}];

关于objective-c - 我的基于 block 的 API 应该只包含完成处理程序还是同时包含成功和失败处理程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18362957/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com