将多个块参数传递给方法

时间:2014-05-02 15:05:20

标签: ios objective-c block objective-c-blocks

In the Apple Docs, it says:

  

最佳做法是只对方法使用一个块参数。

传递多个块参数是否可以;还是应该避免这种情况?

具体来说,这里有一些我正在使用的选项(我希望使用第一个选项):

-(void) doSomethingWithSuccessBlock:(void(^)(void))successBlock withFailureBlock:(void (^)(NSError *)) failureBlock

OR

-(BOOL) didDoSomethingWithFailureBlock:(void (^)(NSError *)) failureBlock

OR

-(void) doSomethingWithCallbackBlock:(void (^)(BOOL, NSError *)) callbackBlock

4 个答案:

答案 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 
    } 

}];