0

サーバーからデータをロードし、応答を非同期的に処理しています。NSURLConnection を使用します。デリゲート connection:didReceiveData: への各呼び出しは、そのチャンクを処理しています。

しかし、大量のデータを受信する直前に、テキスト ビューに新しい行にスクロールするように要求しました。つまり、[textView scrollRangeToVisible:] です。

問題は、多くの場合、すべてのデータが受信されるまで textView がスクロールしないことです。これにはしばらく時間がかかり、UI がハングしたように見えることがあります。

これを回避するために、メイン スレッドがデータの処理でロックされていると考えていたので、小さなチャンクに分割する必要があります。

そこで、connection:didReceiveData で受信したデータを分割して小さな操作を実行するコードに変更し、次を使用してそれらをキューに入れました。

[self performSelectorOnMainThread:withObject:smallerChunk waitUntilDone:FALSE]

考えられるのは、実行ループに一連のイベントを配置し、可能な限り scrollRangeToVisible を処理するということです。

ただし、これは機能しません。少なくとも確実ではありません。私は何が欠けていますか?

4

1 に答える 1

0

「しかし、これは機能していません。少なくとも確実ではありません。」かなりあいまいなエラーの説明です。ただし、バックグラウンド スレッドで接続から受信したデータを処理して、メイン スレッドをブロックしないようにすることをお勧めします。

たとえば、シリアル ディスパッチ キューを作成できます。

dispatch_queue_t myQueue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_SERIAL);

connection:didReceiveData:データの処理をそのキューに送信します。

dispatch_async(myQueue, ^{
    /* process data */
});
于 2012-08-26T04:53:42.233 に答える