【问题标题】:Combining two separate JSON data objects into one in Objective C在 Objective C 中将两个单独的 JSON 数据对象合并为一个
【发布时间】:2023-04-09 09:46:01
【问题描述】:

我试图获取 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:终止调用抛出异常

【问题讨论】:

    标签: ios objective-c json nsdata nsmutabledata


    【解决方案1】:

    来自 Apple 关于performRequestWithHandler 的文档:

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

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

                [request performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) {
    
                    dispatch_async(dispatch_get_main_queue,^{
                           [self receiveData:responseData];
                    });
    
                }];
                accountsize = accountsize + 1;
            }
         }
    

    【讨论】:

    • 请添加“receiveData”的代码,如果您的sn-p包含在另一个块中,请添加相关代码。或者至少解释一下第 5 行的“}}”关闭了什么。
    【解决方案2】:

    这对我来说没有意义:

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

    你在主线程上调用一个方法,那为什么还要执行 dispatch_async 呢? 您应该只在主队列的dispatch_async 中包装对reloadData 的调用。

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-03-27
        • 2018-05-24
        • 1970-01-01
        • 2017-12-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-25
        相关资源
        最近更新 更多