2014-12-02 70 views
1

所以我最近想从使用NSUrlConnection更改为AFNetworking。使用AFNetworking时,我可以用两种方法接收JSON数据,但有些奇怪的事情发生了。使用AFNetworking抓取问题JSON

这是怎么看起来像NSURLConnection的

enter image description here

,这是它的样子与AFNetworking enter image description here

我也不知道这是什么(结构__lidb_autoregen_nspair)是,我不知道这是否是阻止我显示数据的东西

这是从AFNetworking的代码,我使用示例代码从射线

-(void) fetchData{ 

// 1 

NSURL *url = [NSURL URLWithString:string]; 
NSURLRequest *request = [NSURLRequest requestWithURL:url]; 

// 2 
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request]; 
operation.responseSerializer = [AFJSONResponseSerializer serializer]; 
operation.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"]; 

[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { 

    // 3 
    jsonDict = (NSMutableDictionary *)responseObject; 



} failure:^(AFHTTPRequestOperation *operation, NSError *error) { 

    // 4 
    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Error Retrieving Weather" 
                 message:[error localizedDescription] 
                 delegate:nil 
               cancelButtonTitle:@"Ok" 
               otherButtonTitles:nil]; 
    [alertView show]; 
}]; 

// 5 
[operation start]; 

} 

--------------------------- -------------------------------------------------- ------------编辑

-(NSMutableDictionary *) getAllGames{ 

[self fetchData]; 

DataParser *dataParserObjec = [[DataParser alloc] init]; 

return [dataParserObjec sendBackAllGames:jsonDict]; 

} 
+0

'acceptableContentTypes'不应该是'application/json'? – Larme 2014-12-02 10:26:05

+0

嗯,这可能是问题。当我没有那行代码sayin文本/ HTML我遇到了错误块。我猜我的服务器没有发送JSON然后对吗? 但它为什么与NSURLConnection一起使用? @Larme – 2014-12-02 10:28:50

+0

所以这里唯一的解决方法是让服务器发送回json @rob – 2014-12-02 11:36:40

回答

3
  1. 您设置acceptableContentTypestext/html。我认为你这样做是因为你的网络服务没有设置正确的Content-Type标题来表示它是application/json。如果您修复了Web服务以提供正确的标头Content-Type,则可以在Objective-C代码中删除此acceptableContentTypes行。

    如果你想知道为什么你不担心,随着NSURLConnection,那是因为NSURLConnection不会做,除非,当然,你写在自己的代码,例如,didReceiveResponseContent-Type任何验证( ,检查了这一点)。

  2. 你建议,你是无法显示的数据。但是,在它的第二个屏幕快照中。我个人不会担心内部表示,而不是我是否可以访问NSDictionary中的数据。如果你

    NSLog(@"responseObject=%@", responseObject); 
    

    在#3,在成功块内,你看到了什么?我敢打赌,你会看到你的NSDictionary罚款(尽管内部表示的细微差异)。

    我的观点是,你回来了成功获取数据。是的,您的Web服务应设置正确的Content-Type标题,因此您不必覆盖acceptableContentTypes值,但它看起来像AFNetworking正在检索您的数据。

  3. 的可能的问题是,你的主线程试图异步网络请求完成之前使用jsonDict。所以诀窍是推迟使用jsonDict,直到异步请求完成。

    您已更新您的问题,向我们展示您正在实例化DataParser并致电sendBackAllGames。您应该将代码放入您的异步网络请求的完成块中。

    或者,你可以在你的fetchData方法使用完成块状花纹,然后getAllGames方法可以在完成块供应sendBackAllGames代码的AFHTTPRequestOperation的成功块内fetchData电话。


如果使用的是完成块模式,它看起来像

-(void) fetchDataWithCompletionHandler:(void (^)(id responseObject, NSError *error))completionHandler { 

    NSURL *url = [NSURL URLWithString:string]; 
    NSURLRequest *request = [NSURLRequest requestWithURL:url]; 

    AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request]; 
    operation.responseSerializer = [AFJSONResponseSerializer serializer]; 

    // removed once we fixed the `Content-Type` header on server 
    // 
    // operation.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"]; 

    [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { 
     if (completionHandler) { 
      completionHandler(responseObject, nil); 
     } 
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
     [[[UIAlertView alloc] initWithTitle:@"Error Retrieving Weather" 
            message:[error localizedDescription] 
            delegate:nil 
          cancelButtonTitle:@"OK" 
          otherButtonTitles:nil] show]; 

     if (completionHandler) { 
      completionHandler(nil, error); 
     } 
    }]; 

    [operation start]; 
} 

而且你会叫它像这样:

[self fetchDataWithCompletionHandler:^(id responseObject, NSError *error) { 
    if (responseObject) { 
     DataParser *dataParserObjec = [[DataParser alloc] init]; 

     NSMutableDictionary *results = [dataParserObjec sendBackAllGames:jsonDict]; 

     // do whatever you want with results 
    } 
}]; 

如果调用的方法getAllGames需要返回数据,您也会重复此方法的完成块模式。

+0

http://stackoverflow.com/questions/27280648/afnetworking-sending-nsmutabledictionary-as-post – 2014-12-03 23:03:41

+0

http://stackoverflow.com/questions/27307814/label-in-uitableviewcell-not-changing-the-first-time -its-loaded 我有这个问题一段时间,我永远不能解决它。你似乎知道很多,也许你有一个线索,为什么我有这个问题@Rob – 2014-12-07 00:26:38