如何在 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 请求之外使用变量?的主要内容,如果未能解决你的问题,请参考以下文章

颤动如何在http.get请求中传递变量

无法从 axios 函数之外的 axios GET 请求响应中读取值

如何使用数据更新此变量 [关闭]

如何在php中访问foreach循环之外的多个变量

Apache 服务器,如何禁止非GET、POST之外的(比如PROPFIND、OPTIONS等)请求方式?

Python中tkinter包如何提取文本框文字到函数之外?