質問

[OK]を、私は、それぞれの画像UITableView経由で非同期にダウンロードされているUITableViewCellを含むカスタムUIImageViewsでNSURLConnectionを持っています。すべてのかなり標準のもの...

テーブルのスクロールは、新しい画像が動かなく正しくはなく、テーブルまで、レンダリング、バックグラウンドでダウンロードされたときに

問題は、あるます。

どのように私は、それが動いている場合でも、コンテンツだレンダリングするためにテーブルを得るのですか? おかげます。

- UPDATE -

よく見た後、私はテーブルのスクロールを停止するまでNSURLConnectionのデリゲートメソッドが発射されていないことを発見しています。なぜわかりません。すべてのヘルプは素晴らしいことだ。

役に立ちましたか?

解決

スクロール中、実行ループがUITrackingRunLoopModeであるため、

あなたがスクロールを停止するまでの接続デリゲートメッセージが発射されていない理由があります。デフォルトでは、NSURLConnectionスケジュール自体NSDefaultRunLoopModeでは唯一、あなたがスクロールしながら任意のメッセージを得ることはありません。

ここでUITrackingRunLoopModeを含む「一般的な」モードでの接続を、スケジュールする方法は次のとおりです。

NSURLRequest *request = ...
NSURLConnection *connection = [[NSURLConnection alloc]
                               initWithRequest:request
                               delegate:self
                               startImmediately:NO];
[connection scheduleInRunLoop:[NSRunLoop currentRunLoop]
            forMode:NSRunLoopCommonModes];
[connection start];

あなたはそれが始まった後でも実行ループモードを変更することができます示唆して、Appleのドキュメントに反するように思わ初期化子でstartImmediately:NOを指定する必要があります注意ます。

他のヒント

あなたはNSRunLoop上に読んでください。私は、スクロール時に、実行ループがNSEventTrackingRunLoopModeで実行されている、と思われる、とNSURLConnectionは、そのモードには含まれていません。ダウンロードがスクロール中に起こることができるように:, forMode

:あなたはおそらくNSURLConnectionのscheduleInRunLoopを呼び出すことにより、この問題を回避できます。

これはおそらく、おそらく最初の場所で別の実行ループモードの理由であるスクロールのパフォーマンスに影響します。しかし、それを試してみると、それはどのように感じてください!

あなたのイメージのダウンロード&アップデートはNSOperationで折り返す場合は、

、アップデートは、テーブルビューのスクロールとして発生します。

NSOperationのもう一つの利点は、セルがオフスクリーングライドとして、あなたが操作をキャンセルすることができます。それは、彼らはすぐに長いリストをスクロールする場合は特に...ユーザにとってより応答性の多くを感じるだろう。アップルのハイテクトークが、今年はこの手法を奨励します。

あなたのリストはそんなに長くはない、またはあなたがそれらをロードを継続することを好む場合は、

は、あなたの代わりにNSOperationの優先順位を操作することができます。

まず...あなたの接続はおそらく、それはmainRunLoopへのを取得し、それがスクロールアニメーションも処理されているところだまでは開始されません。

私は同じ問題に遭遇し、画像が作成時にすぐに開始するための接続を伝えることで、それを固定します。

    NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:wrapper.request delegate:wrapper];

    [connection start];

あなたが画像を受信し、受信した画像にcell.imageView.imageを設定完了ルーチンでは、このセルが現在の表に表示されている細胞のいずれかに属しているかどうかを確認...とあればすべきですので、[のtableView reloadData]を呼び出します。

    NSInteger itemIndex = theIndexInTheRowDataOfTheCellYouStuffedTheImage

    NSArray *indicies = [_tableView indexPathsForVisibleRows];
    NSUInteger rows = indicies.count;

    if (rows > 0 &&
        itemIndex >= ((NSIndexPath *)[indicies objectAtIndex:0]).row &&
        itemIndex <= ((NSIndexPath *)[indicies objectAtIndex:rows - 1]).row)
    {       
        [_tableView reloadData];
    }
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top