0

标题说多次按下按钮,但实际上我正在寻找堆叠多个事件。我有一个聊天应用程序,可以一次接收许多聊天消息。在我的 messageReceived 函数中,我想滚动到最近聊天的底部。我遇到的问题是有时许多消息(50+)可以同时进入。我已经确定如果执行 50 次滚动到底部是一个巨大的性能瓶颈,但如果仅在收到消息后执行,效果很好。

我想在我的 messageReceived 函数中延迟,比如 0.1 秒后滚动到底部。但我希望在这 0.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 回答