在Objective C中将两个单独的JSON数据对象组合成一个

时间:2013-01-31 18:42:34

标签: ios objective-c json nsdata nsmutabledata

我试图获得2个单独的JSON数据对象,其中包含2个Twitter用户提要,但我遇到了很多麻烦。我想同时处理它们并将它们放入表中但是遇到了困难。

我有一个全局的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:terminate调用抛出异常

3 个答案:

答案 0 :(得分:0)

关于performRequestWithHandler的Apple文档:

  

执行异步请求并在完成后调用指定的处理程序。

这意味着您的请求处理程序只会被调用一次,并且不需要附加块。你很可能崩溃,因为代码没有按照你期望的顺序执行。我会尝试将调用receiveData移动到处理程序块中,以便只有在您实际拥有数据时才会执行它:

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

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

            }];
            accountsize = accountsize + 1;
        }
     }

答案 1 :(得分:0)

这对我来说没有意义:

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

你正在主线程上调用一个方法,为什么要执行dispatch_async呢? 您只应将来自主{{strong}} reloadData的{​​{1}}的电话打包。

同样,我会为每个推文调用dispatch_async,然后将它们添加到数组中。
我认为附加原始数据字节可能会破坏它。

答案 2 :(得分:0)

您应该解析每个json对象并将它们附加到NSMutableArray。使用未解析的json连接NSMutableData对象似乎令人难以置信地倒退。