强制提供完成块

时间:2014-02-06 08:25:09

标签: objective-c standards objective-c-blocks

我想知道这是否是一个好习惯:

我有一个接受参数和回调块的方法,让我们说一下:

-(void)loginWithUsername:(NSString *)username andPassword:(NSString *)password withCompletion:(LoginManagerCompletionBlock)completionHandler;

现在在这种特定情况下,没有完成处理程序就没有用于调用此方法,因为它触发了对登录Web服务的冗余调用(同样,它不会改变任何状态 - 不是客户端也不是服务器侧)。我想通过主动强制要求传递完成块以便进行此Web服务调用来避免这些情况。我有点认为这是Objective C协议中的“@required”方法。所以我的问题是:

  1. 是否需要完成块才能在Objective C中执行行动良好实践?
  2. (编辑:已回答)如何执行此要求?是否有可以帮助我的内置语言语法?
  3. 由于

2 个答案:

答案 0 :(得分:7)

您可以使用函数属性nonnull(params),其中 params 是一个或多个以逗号分隔的参数编号,以指示参数不应为空(nonnull括号表示所有指针参数不应为null)。以你的例子:

- (void) loginWithUsername:(NSString *)username
               andPassword:(NSString *)password
            withCompletion:(LoginManagerCompletionBlock)completionHandler
                           __attribute__((nonnull(3)));

然而,虽然这是一个编译时检查并产生一个警告,但只有在直接传递null时才会这样做。如果参数值是一个计算结果为null的表达式,例如一个具有空值的变量,然后就不会被捕获。

如果参数为null是错误,您可以使用NSParameterAssert(parameter)在方法本身中添加运行时检查,其中参数是方法参数之一的名称,以检查这种情况。此调用被定义为打印错误消息,如果其参数的计算结果为false,则抛出异常,并且null的计算结果为false。

答案 1 :(得分:3)

这正是NSParameterAssert的用途。用它来检查参数是否为零。

NSParameterAssert( completionParameter );

尽管如此,在这种特定情况下,最好将完成处理程序记录为nil并返回。没有必要做任何额外的工作。您可能希望在开发过程中断言明显表明您有一个需要解决的问题。