AFNetworking在ViewControllers之间共享JSON数据?

时间:2013-09-16 19:00:40

标签: ios objective-c json nsdictionary afnetworking

我是一般的编程新手所以请原谅我的无知。如果有人能指出我正确的方向,我将不胜感激。

我按照本教程进行AFNetworking(http://www.raywenderlich.com/30445/afnetworking-crash-course),让它在我自己的项目中工作,从网上解析JSON。

我还没弄明白如何将THAT数据传输到不同的UIViewController。我看到Passing Data between View Controllers和其他相关问题无济于事。

我尝试过使用Delegates& Protocols / Singletons / GlobalVariables / ReferencingClasses,我可以让它们用于其他非JSON相关材料,当我NSLog值时,它总是为NULL。 (此外,JSON数据将发生变化,我在某处读到其中一些选项不可变)

在我看来,教程使用自定义NSDictionary类来存储JSON数据并使用prepareForSegue传递它:但据我所知,这是一个仅限Storyboard的方法。我正在使用nib文件。我应该只将整个项目切换到Storyboard样式,还是有办法用Nibs / Xibs来做这个?

感谢您抽出宝贵时间阅读本文。我想做的最后一件事就是给你一个问题,但我已经被困了一段时间了。

编辑:我已经在ViewController上检索了JSON数据,但我没有将请求转移到其他ViewControllers,我觉得在每个请求JSON数据都是不好的做法。新控制器我需要它。

EDIT2 以下是一些代码(如果您愿意,我可以发布更多代码)

 

-(void)jsonData { NSLog(@"Loading JSON..."); NSURL *url = [NSURL URLWithString:@"http://fillerCode.com"]; AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:url]; NSDictionary *params = [NSDictionary dictionaryWithObjectsAndKeys:@"1",@"station",@"1",@"previous_song", nil]; NSURLRequest *request = [httpClient requestWithMethod:@"POST" path:@"/scripts/MoreFillerCode" parameters:params]; AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest: request // JSON SUCCESS!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) { NSLog(@"Getting Next Song..."); self.get_next_song = (NSDictionary *)JSON; RightViewController *rightViewController = [[RightViewController alloc] init]; rightViewController.get_next_song = self.get_next_song; [self updateViewStuff]; } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) { UIAlertView *av = [[UIAlertView alloc] initWithTitle:@"Error Retrieving Data" message:[NSString stringWithFormat:@"%@",error] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; [av show]; NSLog(@"Operation Failed"); }]; [operation start]; NSLog(@"JSON Operation Started"); }

2 个答案:

答案 0 :(得分:1)

你的主要问题:

  

我已经在我执行的ViewController上检索了JSON数据   请求,但它不会转移到其他ViewControllers。

出现此问题的原因:

RightViewController *rightViewController = [[RightViewController alloc] init];
rightViewController.get_next_song = self.get_next_song;

[self updateViewStuff];

您正在分配和实例化一个全新的视图控制器,然后在其上设置属性。在此之后,您再也不会提及rightViewController,并且在完成块结束时将取消分配。无论何时你使用alloc-init,你都会创建一个新的,如果你不使用它,将它设置为@property,或者在导航控制器上推它,它就会消失。

我不知道您的应用程序的其余部分是否足以为您提供解决此问题的代码,但这是解决此类问题的一般想法:

  • 创建一个处理发送/接收数据的新类(NSObject,而不是UIViewController)。将所有AFNetworking内容放在这里。
  • 当视图控制器需要数据时,让它向这个新对象询问数据。应将数据返回给视图控制器。对象可以使用已保存的数据(如果可用),或使用AFNetworking进行请求(如果不是)

这样,您的视图控制器都不需要彼此了解 - 您不需要沿着链传递数据,只要您需要它就可以从数据源访问它。

答案 1 :(得分:0)

如果您想让您的示例正常工作,您需要执行以下两个步骤之一:

  1. 在@interface中声明你的RightViewController并在初始化你的对象,设置属性然后制作segue时引用那个声明。

  2. 在您创建RightViewController对象的同一块中创建segue - 否则您将失去对它的引用。