0

我试图获取包含 2 个 twitter 用户提要的 2 个单独的 JSON 数据对象,但遇到了很多麻烦。我想同时处理它们并将它们放在一张桌子上,但我遇到了困难。

我有一个全局 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'

* First throw call stack: (0x2622012 0x131ae7e 0x2621deb 0xe4f817 0x568c 0x132e6b0 0xd5b035 0x25a5f3f 0x25a596f 0x25c8734 0x25c7f44 0x25c7e1b 0x290d7e3 0x290d668 0x26265c 0x258d 0x24b5) libc++abi.dylib: terminate called throwing an exception

4

3 回答 3

0

这对我来说没有意义:

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

您在主线程上调用一个方法,为什么要执行 dispatch_async 呢?您应该只将调用包装在reloadDatadispatch_async队列中。

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

于 2013-01-31T20:29:39.473 回答
0

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

于 2013-01-31T21:49:24.117 回答
0

从 Apple 文档中关于performRequestWithHandler

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

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

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

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

            }];
            accountsize = accountsize + 1;
        }
     }
于 2013-01-31T18:49:24.917 回答