3

私は、サーバーから写真を取得し、Pulse News Reader が記事を表示するのと同様の方法で画面に表示する iPhone アプリケーションを開発しています。私は垂直方向にスクロールUITableViewしており、それぞれUITableViewCellに独自のカスタムUITableViewインスタンスが含まれており、ユーザーは写真を水平方向にスクロールできます。

cellForRowAtIndexPath現在、水平スクロール テーブルにデータを入力する方法は、垂直スクロール テーブルのメソッドでサーバー呼び出しを行うことです。新しいセルが表示されるたびに、次のコードのように、その特定のセルの写真のリクエストを送信します。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"EventCell";

    EventViewCell *cell = (EventViewCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil)
    {
        cell = [[EventViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    Event *event = [self.fetchedResultsController objectAtIndexPath:indexPath];

    [self performPhotoFetchForEventID:event.id inCell:cell withRetries:3];

    return cell;
}

このソリューションは、ユーザーが垂直のテーブルをゆっくりとスクロールする場合は非常にうまく機能しますが、ユーザーがリストをすばやくスクロールしたり、リストを「フリック」したりすると、機能しなくなります。基本的に、ユーザーが X 個のイベントをすばやくスクロールすると、アプリのビューがそれらの要求のうち最大 3 つの結果しか必要としない場合でも、アプリは X サーバー要求を開始し、すべての結果を返します。これにより、画像が間違った行に表示されたり、遅延が発生したりすることがあります。

ユーザーのスクロールが速すぎる場合に、サーバー リクエストの発生を防止またはキャンセルするにはどうすればよいですか。または、これを実装して目的の効果を得るより良い方法はありますか?

4

3 に答える 3

4

これにより、写真が間違った行に表示されることがあります

問題の他の部分に取り組む前に、なぜこれが起こっているのかを理解しようとする必要があります。

私の経験から、(もちろん画像のサイズにもよりますが)サーバーから画像を取得し、キャンセルしない方がよいでしょう。ただし、次の点に注意してください。

  • 取得したらキャッシュし、新しいものを要求する前に必ずキャッシュを確認してください。aNSDictionaryとキーを画像の URL として使用できます。

  • 非同期呼び出し。Request/Cache 部分で UI スレッドをブロック/ストレスをかけないでください。NSOperationsとを使用しNSOperationQueueて、リクエストとキャッシュを処理する小さなワーカーを作成します。取得したら、更新するだけUIImageViewです。

  • 画像がフェッチされている間、プレースホルダーを残します。これは、何かが起こっていることをユーザーに示します。

  • セルではなく、DataSource を更新します。その理由は、行 [0,1,2,3,4,5] が表示されていて、スクロールすると行 [40,41,42,43,44,45] が表示されている場合、応答が最初の行の画像が付属していますが、セルは長い間なくなっています (間違った場所の画像で発生している問題かもしれません)。

  • 最後に、Pulse News について言及されているので、彼らと一緒に少し学んでみませんか? このリンクを使用してエンジニアリング ページにアクセスし、画像のダウンロードについて少し学んでください。:)

于 2012-11-15T09:34:56.937 に答える
0

NSUrlConnectionを使用して遅延読み込みモードで画像を取得している場合は、次のコマンドを接続に送信できます。

[connection cancel];

ここにAppleドキュメントがあります

于 2012-11-15T09:27:41.723 に答える
-1

どうしても、すべてのcellForRowAtIndexPathで写真リクエストを作成するべきではありません。非同期画像キャッシングライブラリを使用する必要があります。それらのいくつかがあります。私はJMImageCacheを使用します。

于 2012-11-15T09:27:36.823 に答える