0

タイトルには複数のボタンを押すと書かれていますが、実際には複数のイベントをスタックしようとしています。一度に多くのチャット メッセージを受信できるチャット アプリケーションがあります。私の messageReceived 関数で、最新のチャットの一番下までスクロールしたいと思います。私が抱えている問題は、同時に多くのメッセージ (50 件以上) が届くことがあることです。一番下へのスクロールは、50 回実行すると大きなパフォーマンスのボトルネックになると判断しましたが、メッセージを受信した後にのみ実行するとうまく機能します。

messageReceived 関数で、遅延後、たとえば 0.1 秒後に一番下までスクロールしたいと思います。しかし、この 0.1 秒以内に発生するすべての新しいチャット メッセージを「スタック」して、下へのスクロール リクエストを 1 つだけ発行したいと思います。

これにはタイマーの設定とキャンセルのシステムが機能すると思いますが、うまくいきません。これを実現するためのより良い方法はありますか! ありがとう!

4

2 に答える 2

1

遅延した「一番下までスクロール」リクエストを次のように設定している場合

[[self myObject] performSelector:@selector(scrollToBottom:) 
                      withObject:nil 
                      afterDelay:0.1];  

次に、次のようなキャンセル コマンドを使用できます。

[NSObject cancelPreviousPerformRequestsWithTarget:[self myObject]
                                        selector:@selector(scrollToBottom:)
                                      object:nil];  

あなたscrollToBottom:が呼び出されるのは、キャンセルされないときだけです(つまり、最後の時間です)。これでタイマーは不要です。

于 2012-10-10T23:06:40.840 に答える
0

正確な解決策ではありませんが、正しい方向に導くことができるものです。.h ファイルにフラグを設定し、それを使用して、メソッドが既に呼び出されているかどうかを判断できます。

initメソッドでフラグを次のように設定します。

self.didCallScrollToBottomMethod = FALSE;

scrollToBottomMethodで、次のように条件を確認します。

if (!self.didCallScrollToBottomMethod) {
   self.didCallScrollToBottomMethod = TRUE;
   //set the timer here to scroll after 0.1 seconds
}

スクロールが完了したら、タイマーメソッドで、フラグを次のように設定します。

self.didCallScrollToBottomMethod = FALSE;
于 2012-10-10T22:28:51.857 に答える