如何在 GET 请求之外使用变量?
Posted
技术标签:
【中文标题】如何在 GET 请求之外使用变量?【英文标题】:How do I use a variable outside of a GET request? 【发布时间】:2014-02-05 14:07:21 【问题描述】:我愿意:
在 GET 请求之前初始化变量 (AFNetworking) 赋值给请求成功内的变量 请求完成后使用变量我得到的错误:
在 GET 请求之后尝试对变量执行某些操作时,它会中断,并声称该变量还没有任何值以下是我的代码,我该如何解决这个问题?
- (IBAction)synchronisePressed
//Would like to initialise a variable here
__block NSArray *received;
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
[manager GET:@"http://foo.com/foo/"
parameters:nil
success:^(AFHTTPRequestOperation *operation, id responseObject)
//Assign responseObject to received object
received = responseObject;
NSLog(@"Woo: %@", @"got here");
failure:^(AFHTTPRequestOperation *operation, NSError *error)
NSLog(@"Error: %@", error);
];
//Now outside of request, so use array in some way
[foo received];
【问题讨论】:
Objective-C Blocks and variable scope的可能重复 【参考方案1】:问题不在代码或请求中。问题是 AFNetworking 的 GET
方法是异步的,您正在尝试同步使用它。
这意味着GET
方法将开始工作并在后台运行,其余代码将照常继续。只有当GET
请求完成后,块内的代码才会运行。
此代码是您开始请求后的 1 秒或 30 秒或任意时间。
在[foo received];
行之前添加NSLog
。
日志的顺序会是这样的......
1. Created NSArray called received.
2. Pass NSArray called received to method foo.
// some time later
3. AFNetworking GET request finished.
4. Assign value from the GET request to the NSArray called received.
在这种情况下,您需要做的是将您的调用放在完成块内的[foo received];
。
这样的……
- (IBAction)synchronisePressed
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
[manager GET:@"http://foo.com/foo/"
parameters:nil
success:^(AFHTTPRequestOperation *operation, id responseObject)
//Assign responseObject to received object
NSArray *received = responseObject;
NSLog(@"Woo: %@", @"got here");
[foo received];
failure:^(AFHTTPRequestOperation *operation, NSError *error)
NSLog(@"Error: %@", error);
];
现在你会得到...
1. Created NSArray called received.
// some time later
2. AFNetworking GET request finished.
3. Assign value from the GET request to the NSArray called received.
4. Pass NSArray called received to method foo.
【讨论】:
不知道为什么我没有想到这一点,我在绕圈子过度工程。谢谢 :) 作为一个方面,需要多少代码才能使这个同步?如果有可能的话。 我会避免同步网络代码。通过同步执行它会阻塞主 UI 线程。这意味着如果您的网络请求需要 10 秒,那么应用程序将完全冻结 10 秒。如果您的应用执行任何需要“人类可感知”时间的操作,则异步执行该任务。以上是关于如何在 GET 请求之外使用变量?的主要内容,如果未能解决你的问题,请参考以下文章
无法从 axios 函数之外的 axios GET 请求响应中读取值