最佳做法是只对方法使用一个块参数。
传递多个块参数是否可以;还是应该避免这种情况?
具体来说,这里有一些我正在使用的选项(我希望使用第一个选项):
-(void) doSomethingWithSuccessBlock:(void(^)(void))successBlock withFailureBlock:(void (^)(NSError *)) failureBlock
OR
-(BOOL) didDoSomethingWithFailureBlock:(void (^)(NSError *)) failureBlock
OR
-(void) doSomethingWithCallbackBlock:(void (^)(BOOL, NSError *)) callbackBlock
答案 0 :(得分:7)
使用多个块作为参数会使你的思绪变形,弯曲你的脊椎,让敌人赢得战争。 (用乔治卡林的话来说)
除了开玩笑之外,只有1个块参数是一个很好的目标,但正如其他人所指出的那样,Apple有很多类,其方法占用多个块。在设计使用多个块参数的API之前,花一些时间考虑替代方案,并思考它对代码的可读性和可维护性的作用。有没有更简单的方法来实现相同的目标?如果多个块是实现目标的最简洁方法,那么使用它。我认为你的方法示例同时包含成功块和失败块是非常合理的。您可以将其重构为一个块,该块接受BOOL参数“成功”并询问块中的该参数以决定要执行的操作。 (CAAnimation委托方法animationDidStop:finished:
使用这种方法。实际上,UIView动画中的完成块也是如此。想想它。)
您必须决定是否使方法和传递给它的块更简单,更清晰或更复杂。
答案 1 :(得分:0)
是; AFNetworking已经使用了成功/失败块语义,所以可以肯定。
答案 2 :(得分:0)
由于iOS SDK在方法中使用了多个块参数,因此可以通过这种方式实现自定义代码。
带有2个块参数的iOS标准方法示例:
[UIView animateWithDuration:animationDuration animations:^{
} completion:^(BOOL finished) {
}];
答案 3 :(得分:0)
我不介意多个街区;但是,使用这样的多个块往往会让我非常沮丧。有些人会不同意,但如果我发送一个操作,我不想要两个单独的答案,我想要一个答案,我需要的信息。不发送成功/错误,只是在出现错误时包含错误值。话虽如此,对于像动画和完成这样的事情,有些情况下它是有益的。
我真的更喜欢处理这样的事情:
-(void) doSomethingWithCompletionBlock:(void(^)(NSError *))completionBlock;
然后:
[self doSomethingWithCompletionBLock:^(NSError * error) {
if (!error) {
// Success
}
else {
// Failure
}
}];