[英]Completion handlers and return values
我想調用一個方法,該方法將從其完成處理程序返回一個值。 該方法異步執行,我不想在方法的所有主體執行完之前返回值。 這是一些錯誤的代碼來說明我要實現的目標:
// 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;
}
在NXOAuth2Request
完成之前,我不希望getCurrentClient
方法返回值。 我也無法在請求的響應處理程序中返回當前客戶端。 那我有什么選擇呢?
您需要更改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,則需要使處理程序在主線程上運行 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.