0

コードに URL 要求を追加するまではスムーズに動作するテーブル ビューがあります。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{

...
   //Get Total Comments
    NSString *strURL = [NSString stringWithFormat:@"http://XX.XX.XX.XX/php/commentsTotal.php?CID=%@", [dict objectForKey:@"id"]];
    NSData *dataURL = [NSData dataWithContentsOfURL:[NSURL URLWithString:strURL]];


// to receive the returend value
NSString *strResultCI = [[NSString alloc] initWithData:dataURL encoding:NSUTF8StringEncoding];
cell.commentCount.text = strResultCI;


return cell;

}

問題は、表のセルをスクロールするときに、電話がサーバーと通信し、応答を待ってからセルに表示する必要があることです。
言うまでもなく、テーブルのパフォーマンスが低下しました。私の質問は、バックグラウンド スレッドに JSON データ リクエストを簡単に追加する方法について、良い例やチュートリアルを持っている人はいますか? SDWebImage を使用して画像を非同期に処理していますが、データ部分をどこから始めればよいかわかりません。

4

3 に答える 3

0

私はあなたがする必要があることは次のとおりだと思います:

  1. は辞書の配列のような単純なキャッシュを作成します。ここkeyurlvalueはですdata

  2. 新しいセルを表示するときにcheck the cache at first、そこに何も存在しない場合はsend asynchronous request、サーバーに対して(応答を待っているかどうかを知ることもできます)

  3. サーバーから応答を受信しcheck the tableView visible cellsたら、キャッシュを埋めます。表示されているセルのデータを受信した場合は、tableViewの更新を使用して実行します(データの再読み込みは遅くなります)。

私はAFNetworkingAPI呼び出しにライブラリを使用しています(ASIHTTPRequestも良かったです)

ちなみに、ユーザーが高速でスクロールしたときにリクエストをキャンセルする必要があると思います。これは、を介して行うことができますNSOperationQueue。これらのすべてのリクエストを同時に実行することはおそらく望ましくありません。最も必要なデータと他のデータをキャンセルするデータのみをアクティブにすることをお勧めします。

于 2012-10-12T21:50:24.580 に答える
0

WebサーバーからJSONデータを取得する必要があり、バックグラウンドスレッドでそれを実行する必要がある場合は、次のことを試してください。

dispatch_queue_t webCall = dispatch_queue_create("web call", NULL);
dispatch_async(webCall, ^{
NSString *strURL = [NSString    stringWithFormat:@"http://XX.XX.XX.XX/php/commentsTotal.php?CID=%@", [dict objectForKey:@"id"]];
NSData *dataURL = [NSJSONSerialization JSONObjectWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:strURL]]];
});
dispatch_async(dispatch_get_main_queue(), ^{
NSString *strResultCI = [[NSString alloc] initWithData:dataURL encoding:NSUTF8StringEncoding]; cell.commentCount.text = strResultCI;
});

Foundationでクラスを使用NSJSONSereliazationしてjsonデータを解析します。データに応じて、辞書または配列のいずれかを返します。dispatch_async(webCall, ^...);バックグラウンドスレッドを作成しdispatch_async(dispatch_get_main_queue(), ^...てメインスレッドを元に戻します。これは、セルのテキストを変更するなど、UIに関連する何かを行う必要がある場合に必要です。

また、テーブルビューのセルデータを、ではなく事前に準備しておくようにしてください-tableView: cellForIndexPath

于 2012-10-13T00:32:01.407 に答える
0

これがサーバー/クライアント通信を行う唯一のポイントである場合は、単に非同期 NSURLConnection を行う必要があります。

それ以外の場合、多くのクライアント/サーバー通信を行っている場合、最良のアプローチは AFNetworking またはその他の http クライアント ライブラリです。

于 2012-10-12T23:36:59.437 に答える