gpt4 book ai didi

ios - 从异步回调传递数据

转载 作者:行者123 更新时间:2023-11-29 12:45:58 24 4
gpt4 key购买 nike

出于某些原因,我需要从异步回调中传递数据,

如果目标是一个全局变量,这没什么大不了的,

但是变量只是在一个方法中使用,所以我希望我可以在一个方法中完成。

- (void)login
{
dispatch_group_t login_group = dispatch_group_create();

NSString* secureToken = nil;
NSString* loginSeed = nil;

[self getSecureToken:&secureToken group:login_group];
[self getLoginSeed:&loginSeed group:login_group];

dispatch_group_notify(login_group, dispatch_get_main_queue(), ^{
NSLog(@"token: %@", secureToken);
});
}

- (void)getSecureToken:(NSString **)token group:(dispatch_group_t)group
{
dispatch_group_enter(group);

[_manager setResponseSerializer:[AFHTTPResponseSerializer serializer]];
[_manager GET:@"/secure_token" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {

//get secure token
NSDictionary* result = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:nil];
*token = [result objectForKey:@"SECURE_TOKEN"];
dispatch_group_leave(group);

} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
dispatch_group_leave(group);
}];
}

如果我这样做,那么它会打印null

无论如何,我可以通过异步回调访问数据,但不能通过全局变量或委托(delegate)访问数据?

因为我只需要这些数据用于登录方法。

最佳答案

由于您似乎具有 JavaScript 背景,因此您可能熟悉promises

在 Objective-C 中有一些库实现了 promise 。使用 promise 库的方法可能看起来像这样:

您的登录将变为异步(不可避免):

- (Promise*)promiseLogin {
return [self promiseSecureToken]
.then(^id(NSString* secureToken){
return [self promiseLoginWithToken:secureToken seed:seed];
}, nil);
}

您的方法 promiseSecureToken 可以按如下方式实现:

- (Promise*) promiseSecureToken
{
Promise* promise = [[Promise alloc] init];
[_manager setResponseSerializer:[AFHTTPResponseSerializer serializer]];
[_manager GET:@"/secure_token" parameters:nil
success:^(AFHTTPRequestOperation *operation, id responseObject)
{
//get secure token
NSError* error;
NSDictionary* result =
[NSJSONSerialization JSONObjectWithData:responseObject
options:NSJSONReadingMutableContainers
error:&error];
if (result) {
NSString* token = [result objectForKey:@"SECURE_TOKEN"];
[promise fulfillWithValue:token];
}
else {
[promise rejectWithReason:error];
}
}
failure:^(AFHTTPRequestOperation *operation, NSError *error) {
[promise rejectWithReason:error];
}];

return promise;
}

你会像这样使用它:

[self promiseLogin]
.then(^id(id result){
// "result" is whatever promiseLoginWithToken:seed: returns
return something;
},nil)
.then(nil, ^id(NSError*error){
// catch ANY error, no matter where it occurred in the previous tasks:
NSLog(@"ERROR: %@", error);
return nil;
});

如需库列表和一些更有用的信息,请查看此处:https://softwareengineering.stackexchange.com/questions/184597/success-failure-blocks-vs-completion-block/219929#219929

关于ios - 从异步回调传递数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23693162/

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