完成处理程序和返回值

8
我希望调用一个方法,该方法将从其完成处理程序返回一个值。该方法是异步执行的,我不想在方法体的所有内容执行之前返回值。以下是一些有问题的代码,以说明我的目标:

// This is the way I want to call the method
NSDictionary *account = [_accountModel getCurrentClient];

// This is the faulty method that I want to fix
- (NSDictionary *)getCurrentClient
{
    __block NSDictionary *currentClient = nil;
    NXOAuth2Account *currentAccount = [[[NXOAuth2AccountStore sharedStore] accounts] lastObject];

    [NXOAuth2Request performMethod:@"GET"
                        onResource:[NSURL URLWithString:[NSString stringWithFormat:@"%@/clients/%@", kCatapultHost, currentAccount.userData[@"account_name"]]]
                    usingParameters:nil
                        withAccount:currentAccount
                sendProgressHandler:nil
                    responseHandler:^ (NSURLResponse *response, NSData *responseData, NSError *error) {
                        NSError *jsonError;

                        currentClient = [NSJSONSerialization JSONObjectWithData:responseData
                                                                        options:kNilOptions
                                                                            error:&jsonError];
                    }];

    return currentClient;
}

我不希望getCurrentClient方法在NXOAuth2Request完成之前返回值。也不能在请求的响应处理程序中返回当前客户端。那么我的选择是什么?

1个回答

19

你需要更改 getCurrentClient 的实现方式,改为接收一个完成块而非返回值。

例如:

-(void)getCurrentClientWithCompletionHandler:(void (^)(NSDictionary* currentClient))handler
{
    NXOAuth2Account *currentAccount = [[[NXOAuth2AccountStore sharedStore] accounts] lastObject];

    [NXOAuth2Request performMethod:@"GET"
                        onResource:[NSURL URLWithString:[NSString stringWithFormat:@"%@/clients/%@", kCatapultHost, currentAccount.userData[@"account_name"]]]
                   usingParameters:nil
                       withAccount:currentAccount
               sendProgressHandler:nil
                   responseHandler:^ (NSURLResponse *response, NSData *responseData, NSError *error) {
                        NSError *jsonError;

                        NSDictionary* deserializedDict = [NSJSONSerialization JSONObjectWithData:responseData
                                                                                         options:kNilOptions
                                                                                           error:&jsonError];
                        handler(deserializedDict);
                }];
}

记住,getCurrentClient立即返回,而网络请求则在另一个线程上进行。如果你想使用响应处理程序更新UI,请不要忘记需要使处理程序在主线程上运行


我能否让getCurrentClient返回一个值并且有一个完成处理程序?返回的值可能是:return handler(deserializedDict)。 - Robert Audi
1
getCurrentClient 返回的是实际异步请求完成之前的数据。你需要更新你的结构,支持在使用 getCurrentClient 时使用回调函数而不是返回值。 - Tim
太棒了,这帮了我很多忙。谢谢,Tim。 - JCurativo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接