2014-02-05 29 views
1

我想如何在GET请求之外使用变量?

  • 一个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]; 
} 
+0

[Objective-C的块和变量的作用域(可能重复http://stackoverflow.com/questions/9407675/objective-c-blocks-and-variable-scope) – Larme

回答

2

问题不在代码或请求中。问题是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. 
+0

不知道为什么我没有想到这一点,我正在绕圈工程。谢谢:)作为一方,需要多少代码才能实现同步?如果可能的话。 –

+0

我会避免同步网络代码。通过同步执行它将阻​​止主UI线程。这意味着如果您的网络请求需要10秒钟,则应用程序将完全冻结10秒。如果您的应用程序执行任何需要“人为察觉”的时间量,那么请异步执行该任务。 – Fogmeister