1

私は多くのトピックを見てきましたが、まだ理解できません。

コンテンツをオンラインでダウンロードする UITableview があります。各セルには画像があり、GCD を使用して画像をダウンロードします。ダウンロードされたイメージはディスクに保存され、セルがロードされるたびに、ファイルが既に存在するかどうかがチェックされます。存在しない場合は -> gcd、nsdata などです。

誰かが良好なインターネット接続 (wifi) を持っている場合はすべてうまくいきますが、私の安っぽい 3G 接続で View から View に (行ったり来たり) ホップしようとすると、何が起こるかというと、それはそのキューを終了したいということです (約4 セル)、しかし、既に新しいもの、新しいもの、新しいものが割り当てられており、最終的にユーザーは実際の UITableview が読み込まれる前に、他のものが実行される前に長い時間待たなければなりません (彼には見えません)。NSLog を使用すると、別のビューにいる場合でも、画面に表示されていた uiimages をダウンロードして作成していることがわかります。各タスクは約 100 kb であり、低速の場合 (またはインターネットに接続されていない場合でも?!)、タスクが多い場合は時間がかかる場合があります。

キャンセルできないことはわかっていますが、BOOL 変数の使用に関する他のトピックを読みましたが、実際にはわかりません。ユーザーが画面を離れたときに BOOL 変数が変更されたとしても、セルは既にキューに入っていますよね?

ユーザーが Navigationcontroller の [戻る] ボタンをタップしてビューを離れたときに、キューで使用されているブロックのデータを変更する (空にする) ことは可能ですか? そのため、ダウンロードするものは何もなく、ブロックはすぐに実行されます (やることが何もない)。では、配列newsitemsのすべての値をnilにするようなものですか?データソースを変更することは可能ですか? または待機中のブロックには、待機中に既にデータソースが含まれていますか?

次に、別の問題があります。これは、現在実行されているブロックには影響しません。

誰かが私を良い方向に向けることができますか?

ありがとうございました。

プラストー

4

2 に答える 2

1

NSBlockOperationとを使用NSOperationQueueして、キャンセル可能なダウンロード タスクを作成できます。NSBlockOperation何らかの作業を実行するブロックを与えることで を作成します。あなたの場合、ブロックは URL のコンテンツをダウンロードします。

ビュー コントローラーでは、キューに送信された操作のリストを保存します。ユーザーが現在のビューを離れることを決定した場合は、保留中の各操作を呼び出しcancelて、不要な作業が行われないようにすることができます。ただし、現在実行中の操作は完了するまで実行されます。現在実行中の操作をキャンセルするには、作業を行っているブロックに NSOperation オブジェクトへの弱い参照を格納する必要があります。次に、ブロックの本体内で適切な間隔で、操作がキャンセルされたかどうかを確認し、早期に終了できます。

// Create a queue on which to run the downloads
NSOperationQueue* queue = [NSOperationQueue new];

// Create an operation without any work to do
NSBlockOperation* downloadImageOperation = [NSBlockOperation new];

// Make a weak reference to the operation. This is used to check if the operation
// has been cancelled from within the block
__weak NSBlockOperation* operation = downloadImageOperation;

// The url from which to download the image
NSURL* imageURL = [NSURL URLWithString:@"http://www.someaddress.com/image.png"];

// Give the operation some work to do
[downloadImageOperation addExecutionBlock: ^() {
    // Download the image
    NSData* imageData = [NSData dataWithContentsOfURL:imageURL];

    // Make sure the operation was not cancelled whilst the download was in progress
    if (operation.isCancelled) {
        return;
    }

    // Do something with the image
}];

// Schedule the download by adding the download operation to the queue
[queue addOperation:imageDownloadOperation];

// As necessary
// Cancel the operation if it is not already running
[imageDownloadOperation cancel];

この正確なトピックについて、今年の WWDC で「Building Concurrent User Interfaces on iOS」というタイトルの良い講演が行われました。ビデオとスライドはこちらからご覧いただけます

于 2012-09-09T14:37:19.033 に答える
0

しばらく前に開発したアプリで同様の問題に直面し、必要なことをすべて実行する最善の方法は、https://github.com/MugunthKumar/MKNetworkKitを使用することであることがわかりました。

変換を学習して理解するのに 1 日の大半を費やし、それからさらに 2 ~ 3 日かけて、必要なものに正確に調整しました。

それを使用することに決めた場合、または機能の完全な概要が必要な場合は、ここから始めてください http://blog.mugunthkumar.com/products/ios-framework-introducing-mknetworkkit/

于 2012-09-09T10:12:46.300 に答える