gpt4 book ai didi

ios - block 作为 block 的参数

转载 作者:行者123 更新时间:2023-11-28 18:56:24 25 4
gpt4 key购买 nike

我正在 Objective-C 中实现一个库,它试图依赖 block 并减少委托(delegate)调用的使用。

此库将在需要时提示应用程序输入用户凭据,应用程序应为他们提供调用 block 。由于凭据将由图书馆检查,我希望应用程序返回另一个 block 以通知凭据是否正确。这样我就可以让 UI 一直显示 HUD,直到我得到响应。

我为主要应用程序提供了一个协议(protocol)来实现:

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

应用程序应按如下方式实现协议(protocol):

- (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)
})];

这样我应该只需要一个委托(delegate)调用进一步的通信将使用 block 。

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

有人知道我应该为 authResult block 使用的语法吗?

提前感谢您的任何提示!

最佳答案

在使用函数指针和 block 时,使用 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");
}
});
}

关于ios - block 作为 block 的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32145996/

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