2017-01-04 21 views
-1

使用AFNetworking 3.0庫時出現此錯誤。代碼:- [__ NSDictionaryI arrayForKey:]:發送到實例的無法識別的選擇器

[manager GET:@"..." 
     parameters:nil 
     progress:nil 
     success:^(NSURLSessionTask *task, id responseObject) { 
      NSArray *result = [responseObject arrayForKey:@"items"]; 

      self.objects = [NSMutableArray arrayWithArray:responseObject]; 
      [self.tableView reloadData]; 
     } failure:^(NSURLSessionTask *operation, NSError *error) { NSLog(@"Error: %@", error); }]; 

當我使用arrayWithArray,我得到:

[NSArray initWithArray:range:copyItems:]: array argument is not an NSArray' 
+0

你得到什麼錯誤?我只在這裏看到你的代碼。 – fsb

+2

錯誤消息明確指出'responseObject'是一個不響應'arrayForKey'的字典。在文檔中快速查看,發現有兩個類對'arrayForKey'作出響應:'NSUserDefaults'和'NSUbiquitousKeyValueStore' – vadian

+0

+1 @vadian:'reponseObject'是一個'NSDictionary'對象。承認,它有一個鍵「@」項的價值「,並且該值是一個」NSArray「對象,你應該至少做self.objects = [NSMutableArray arrayWithArray:result];'而不是'self.objects = [NSMutableArray arrayWithArray:responseObject];'... – Larme

回答

2
  1. 你千萬不要相信用戶的輸入,即來自於網絡,並與來歷不明的其他第三方數據的數據,所以你應該總是檢查你是否得到你所期望的。即使您假設responseObjectNSDictionary,您也必須檢查它以確保並正確處理可能的錯誤。

  2. 在你的例子中(根據崩潰消息)responseObjectNSDictionary類型。該課程沒有-[arrayForKey:]方法。當您嘗試調用未在層次結構中實現的方法(發送消息,實際上是)時,會出現該類型的異常 - 「發送給實例的無法識別的選擇器」。另外,關於轉發擴展信息的check this article

固定片段:

[manager GET:@"..." 
parameters:nil 
    progress:nil 
    success:^(NSURLSessionTask *task, id responseObject) { 
    if ([responseObject isKindOfClass:[NSDictionary class]]){ 
     NSDictionary *dic = (NSDictionary*)responseObject; 
     id items = dic[@"items"]; 
     if ([items isKindOfClass:[NSArray class]]){ 
      self.objects = [(NSArray*)items mutableCopy]; 
      [self.tableView reloadData]; 
     } else { 
      NSLog(@"Error: \"items\" is not an array"); 
     } 
    } else { 
     NSLog(@"Error: unexpected type of the response object"); 
    } 
} failure:^(NSURLSessionTask *operation, NSError *error) {    
    NSLog(@"Error: %@", error); 
}]; 
+0

+1,因爲你幫了忙。順便說一句,我的數據總是明確的..這是我自己的PHP文件,它總是以JSON形式出現。感謝與[]的解決方案。 –

相關問題