0

2 つの Twitter ユーザー フィードを含む 2 つの個別の JSON データ オブジェクトを取得しようとしていますが、多くの問題が発生しています。両方を同時に処理してテーブルに入れたいのですが、問題があります。

各 JSON リクエストを追加するグローバル NSMutableData があります。すべてが 1 か所に配置されたら、グローバル 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

各jsonオブジェクトを解析し、それらをNSMutableArrayに追加する必要があります。NSMutableDataオブジェクトを解析されていないjsonと連結すると、信じられないほど逆行するように見えます。

于 2013-01-31T21:49:24.117 に答える
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

に関するAppleのドキュメントからperformRequestWithHandler

非同期リクエストを実行し、完了したら指定されたハンドラーを呼び出します。

これは、リクエスト ハンドラーが 1 回だけ呼び出され、チャンクを追加する必要がないことを意味します。コードが期待どおりの順序で実行されないため、クラッシュする可能性が非常に高くなります。への呼び出しを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 に答える