我正在Objective-C中实现一个库,该库尝试依赖于块并减少委托调用的使用。

该库将在需要时提示应用提供用户凭据,并且应用应提供调用它们的权限。由于凭据将由库检查,因此我希望该应用程序提供另一个块以通知凭据是否正确。这样一来,我可以保持UI一直显示HUD,直到得到响应为止。

我为主要应用提供了一个协议来实现:

@protocol LibProtocol <NSObject>
- (void) needsUserCredentials:(void (^)(NSString *username,
                                    NSString *password,
                                    void (^authResult)(Result result, NSError *error) ))gotCredentials;
@end


该应用应实施以下协议:

- (void) needsUserCredentials:(void (^)(NSString *username,
                                    NSString *password,
                                    void (^)(Result result, NSError *error) ))gotCredentials{
    // get credentials from UI
    gotCredentials(@"username",@"password", ^(Result result, NSError *error){
    if(result == ResultAuthorized) NSLog(@"ResultAuthorized");
    else NSLog(@"ResultDenied");
});


}

在库中,该方法的用法如下:

[self.delegate needsUserCredentials:^(NSString *username,
                                      NSString *password,
                                      void (^)(Result result, NSError *error)) {
    if([authorizeUser:username password:password]) authResult(AuthResultAuthorized)
    else authResult(AuthResultDenied)
})];


这样,我只需要一个委托调用,进一步的通信就将使用块。

问题是我无法获得authResult块的正确语法,该块作为getCredentials中的参数传递。我尝试了许多组合,但是大多数时候我会收到Xcode的警告,并且当我可以提供无错误的语法时,在simulador /设备上运行时它会崩溃。

有人知道我应该对authResult块使用的语法吗?

预先感谢您的任何提示!

最佳答案

在使用函数指针和块时,通常最好使用typedef来简化语法并使代码更具可读性。

例如:

typedef void (^UserResponseBlock)(Result result, NSError* error);

typedef void (^UserRequestBlock)(NSString* username,
                                 NSString* password,
                                 UserResponseBlock authResult);


现在,您可以使用两种类型的UserResponseBlockUserRequestBlock,就像其他任何类型一样:

- (void)needsUserCredentials:(UserRequestBlock)gotCredentials
{
    gotCredentials(@"username", @"password", ^(Result result, NSError* error) {
        if (result == ResultAuthorized)
        {
            NSLog(@"Result Authorized");
        }
        else
        {
            NSLog(@"Result Denied");
        }
    });
}

10-06 11:32