【问题标题】:How do I use a variable outside of a GET request?如何在 GET 请求之外使用变量?
【发布时间】: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];
}

【问题讨论】:

标签: ios iphone objective-c networking afnetworking


【解决方案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 秒。如果您的应用执行任何需要“人类可感知”时间的操作,则异步执行该任务。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-25
相关资源
最近更新 更多