1

NSURLConnection を使用したダウンロードがバックグラウンドで行われているときに、iPhone 4 でコレクション ビューをスクロールしているときにフレームレートが大幅に (5 FPS まで) 低下することに気付きました。最初は AFNetworking が原因ではないかと疑っていましたが、単純にブロックを使用しただけでも同じことが起こることがわかりました。

- (void)startBlockDownload:(id)sender
{
    NSLog(@"starting block download");

    dispatch_queue_t defQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

    void (^downloadBlock) (void);

    downloadBlock = ^{
        NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:_urlString]];
        NSURLResponse *response = nil;
        NSError *error = nil;

        NSData* result = [NSURLConnection sendSynchronousRequest:request  returningResponse:&response error:&error];

        NSLog(@"block request done");
    };

    dispatch_async(defQueue, downloadBlock);
}

何を与える?バックグラウンドでのダウンロードは負荷が高すぎて、UI のレンダリングが非常に遅くなりますか? 遅いフラッシュメモリですか?バックグラウンドでのダウンロード中に UI の応答性を維持するためにできることはありますか?

この問題を示すサンプル プロジェクトを作成しました: https://github.com/jfahrenkrug/AFNetworkingPerformanceTest

このトピックについて私が開始した AFNetworking に関するこの問題も参照してください: https://github.com/AFNetworking/AFNetworking/issues/1030#issuecomment-18563005

どんな助けでも大歓迎です!

4

1 に答える 1

2

あなたがリンクしたコメントが言っているように: iPhone 4 はまだシングルコア マシンなので、どれだけ「マルチタスク」を行っても、一度に 1 つのコード セットしか実行されません。さらに悪いことに、sendSynchronousRequest と UI コードはどちらもコードのセットをブロックしているため、OS によって割り当てられた最大時間を占有し、OS はコストのかかるコンテキスト スイッチを実行して、他方を実行する準備をします。

次の 2 つのことを試すことができます。

1) 同期要求をディスパッチする代わりに、非同期 API を使用しますNSURLConnection(ただし、 でこれを試したような気がしますAFNetworking)。

2) ディスパッチ先のキューの優先度を下げます (できれば DISPATCH_QUEUE_PRIORITY_BACKGROUND にするのが望ましい)。これにより、メイン キューの実行サイクルが増える可能性がありますが、操作全体が 1 つの大きなチャンクにすぎないため、そうではない可能性があります。

これらの両方が機能しない場合は、シングルコア プロセッサで処理するには多すぎる可能性があります (スクロールは簡単な操作ではなく、ダウンロードにはデータを受信するための一定の実行時間が必要です)。とにかくそれが私の最善の推測です...

于 2013-05-29T10:14:15.800 に答える