2014-12-02 69 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