2013-01-31 69 views
0

我試圖獲得2個單獨的JSON數據對象,其中包含2個Twitter用戶訂閱源,但遇到了很多麻煩。我想同時處理它們,並將它們放在桌子上,但遇到困難。將兩個單獨的JSON數據對象合併爲一個目標C

我有一個全局的NSMutableData可以獲取每個附加到它的JSON請求。一旦所有它在一個地方即時嘗試然後用全局NSMutableData更新表。 allTheData是全局的NSMutable對象。

if ([twitterAccounts count] > 0) { 
    while (accountsize != [twitterAccounts count]) { 
     [request performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) { 

      [allTheData appendData:responseData]; 
     }]; 
     accountsize = accountsize + 1; 
    }} 

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 

     [self performSelectorOnMainThread:@selector(receiveData:) withObject:allTheData waitUntilDone:YES]; 
    }); 

- (void)receiveData:(NSData *)data { 
    self.tweets = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil]; 
    [self.TwitterTableView reloadData]; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UITableViewCell *cell = [[UITableViewCell alloc] init]; 
    NSDictionary *tweet = [self.tweets objectAtIndex:indexPath.row]; 

    cell.textLabel.text = [tweet objectForKey:@"text"]; 


    return cell; 
} 

每當我運行此代碼崩潰,並吐出了以下

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'data parameter is nil' 

*第一擲調用堆棧: (0x2622012 0x131ae7e 0x2621deb 0xe4f817 0x568c 0x132e6b0 0xd5b035 0x25a5f3f 0x25a596f 0x25c8734 0x25c7f44 0x25c7e1b 0x290d7e3 0x290d668 0x26265c 0x258d 0x24b5) libC++ abi.dylib:終止調用拋出異常

回答

0

從Apple文檔關於performRequestWithHandler

執行異步請求並在完成時調用指定的處理程序。

這意味着您的請求處理程序只會被調用一次,並且不需要添加塊。您很可能會崩潰,因爲代碼沒有按您期望的順序執行。

  [request performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) { 

       dispatch_async(dispatch_get_main_queue,^{ 
         [self receiveData:responseData]; 
       }); 

      }]; 
      accountsize = accountsize + 1; 
     } 
    } 
+0

現在編輯並提供更多信息 – user1257220

+0

請添加「receiveData」的代碼,如果您的代碼段被封閉在另一個塊中,請添加相關代碼。或者至少解釋第5行關閉的「}}」。 – Stavash

+0

@ user1257220看到我編輯的答案 – Stavash

0

這是沒有意義的,我:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
     [self performSelectorOnMainThread:@selector(receiveData:) withObject:allTheData waitUntilDone:YES]; 
    }); 

您是使其得到執行,只有當你真正擁有的數據我會嘗試移動呼叫receiveData進入處理程序塊調用主線程上的方法,爲什麼執行dispatch_async呢? 您只能在主隊列中將reloadData打到。

同樣,我會爲每條推文調用JSONObjectWithData:options:error:,然後將它們添加到數組中。
我認爲追加原始數據字節可能會破壞它。

0

你應該解析每個json對象並將它們附加到一個NSMutableArray。使用未分析的json連接NSMutableData對象似乎令人難以置信地倒退。