标题显示多个按钮按下,但实际上我正在寻找堆叠多个事件。我有一个可以同时接收许多聊天消息的聊天应用程序。在我的messageReceived函数中,我想滚动到最近聊天的底部。我遇到的问题是,有时许多消息(50+)可以同时进入。我已经确定,如果执行50次,滚动到底部是一个巨大的性能瓶颈,但如果仅在收到消息后执行,则效果很好。
我希望在我的messageReceived功能中延迟一段时间后滚动到底部,比如0.1秒。但我希望在这0.1秒内发生的所有新聊天消息都“堆叠”,并且只发出一个滚动到底部请求。
我认为设置和取消计时器的系统可以为此工作,但我无法做到正确。是否有更好的方法来实现这一目标!谢谢!
答案 0 :(得分:1)
如果您使用类似
的设置来设置延迟的“滚动到底部”请求[[self myObject] performSelector:@selector(scrollToBottom:)
withObject:nil
afterDelay:0.1];
然后您可以使用取消命令,如
[NSObject cancelPreviousPerformRequestsWithTarget:[self myObject]
selector:@selector(scrollToBottom:)
object:nil];
然后你的scrollToBottom:
被调用的唯一时间是它没有被取消(所以,最后一次被取消)。现在你不需要计时器了。
答案 1 :(得分: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;