将块中异步接收的 JSON 对象传递给实例变量 - 在 iOS6 上使用 AFNetworking

Posted

技术标签:

【中文标题】将块中异步接收的 JSON 对象传递给实例变量 - 在 iOS6 上使用 AFNetworking【英文标题】:Passing JSON object received asynchronously in block to an instance variable - using AFNetworking on iOS6 【发布时间】:2013-01-25 05:10:38 【问题描述】:

此代码具有 JSON,但无论我做什么,我都无法弄清楚如何将此 JSON 传递给实例变量。每次我将它设置为一个变量并在此方法之外调用该变量时它为零。所以我可以收集到的是在以下异步调用返回之前调用了该变量。

所以问题是我可以对以下代码做什么,以便提取 JSON 值。在互联网的某个地方,我读到我需要向它传递一个块,该块将在完成时作为回调服务器,但我不知道如何为以下代码执行此操作

 //Gets the JSON object that contains the entries from the server
 -(void)getEntriesFromServer 
 
   NSLog(@"%s", __PRETTY_FUNCTION__);

   [[appAPIClient sharedClient] getPath:@"/entries"
                          parameters:nil
                             success:^(AFHTTPRequestOperation *operation, id JSON)
    
      NSLog(@" JSON array = %@",[JSON valueForKeyPath:@"entries"]);
    failure:^(AFHTTPRequestOperation *operation, NSError *error)
    
      NSLog(@" Json not received");
    ];
  

谢谢

【问题讨论】:

【参考方案1】:

尝试将__block 添加到数组的定义中,例如__block NSArray* entriesArray; 或制作像

这样的属性
@property (nonatomic, retain) NSArray* entriesArray;

并像这样更改您的代码

[[appAPIClient sharedClient] getPath:@"/entries"
                               parameters:nil
                                  success:^(AFHTTPRequestOperation *operation, id JSON)
   

     //NSLog(@" Json value received is : %@ ",[JSON description]);
     //NSLog(@" JSON array = %@",[JSON valueForKeyPath:@"entries"]);

     self.entriesArray = [NSArray arrayWithArray:[JSON valueForKeyPath:@"entries"]];
     NSLog(@" JSON array from inside block = %@", _entriesArray);
     failure:^(AFHTTPRequestOperation *operation, NSError *error)
    
        NSLog(@" Json not received");
    ];

希望对你有帮助

【讨论】:

您好,谢谢,但这是一个异步调用,不会立即返回 JSON 值。我希望得到一个使用完成块的答案。你有什么办法让我知道吗?谢谢 我想,你的 API 客户端是这样的:`AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc]initWithRequest:request]; [操作 setCompletionBlockWithSuccess:yourSuccessBlockfailure:yourFailureBlock]; 是的,库提供的 AFHTTPClient 在其实现中执行此操作 yourSuccessBlock - 它是一个块,将在成功完成请求后调用。在此块中,您应该解析来自服务器的答案。如果来自服务器的答案是 JSON 字符串,那么您可以使用 SBJSONParser 从中获取 JSON SBJSON。所以你的代码就像code

以上是关于将块中异步接收的 JSON 对象传递给实例变量 - 在 iOS6 上使用 AFNetworking的主要内容,如果未能解决你的问题,请参考以下文章

将对象作为参数传递给函数

如何将参数传递给反序列化json的构造函数

将实例变量作为参数传递给同一类中的方法?

通过jquery ajax将json对象传递给webmethod

RMarkdown:如何将参数传递给在 R 中定义为变量的 bash 块?

Python - 将 JSON 对象传递给函数时附加到 JSON 对象的附加“成员”