防止委托方法过于频繁地被调用

时间:2013-11-11 09:16:26

标签: ios objective-c delay

如何在被调用的某个方法之间添加延迟?

这是我的代码,我想每秒只触发30次:

- (void) scrollViewDidScroll: (UIScrollView*)scrollView {
   [self performSelector:@selector(needsDisplay) withObject:nil afterDelay:0.033];
}

- (void) needsDisplay {
    [captureView setNeedsDisplay];
}

如果我这样离开它,它只会在用户停止滚动后调用。

我想要做的是在用户滚动时调用该方法,但每次调用之间的延迟为33毫秒。

4 个答案:

答案 0 :(得分:4)

有不同的委托方法可以调用不同的occausion。此方法仅在用户完成滚动时调用。所以如果你愿意,你可以执行一些任务。如果你想在滚动或滚动之前做一些事情,你可以使用不同的委托方法。根据您的功能选择以下选项之一。

– scrollViewDidScroll:
– scrollViewWillBeginDragging:
– scrollViewWillEndDragging:withVelocity:targetContentOffset:
– scrollViewDidEndDragging:willDecelerate:
– scrollViewShouldScrollToTop:
– scrollViewDidScrollToTop:
– scrollViewWillBeginDecelerating:
– scrollViewDidEndDecelerating:

有关这些代表的详细说明,请点击此链接。 https://developer.apple.com/library/ios/documentation/uikit/reference/uiscrollviewdelegate_protocol/Reference/UIScrollViewDelegate.html 代表应该在应该的时候打电话......否则你会引起一些小故障。

答案 1 :(得分:0)

委托方法将被调用,您无法设置限制。我认为一个很好的选择是在NSOperationQueue中添加操作,并且由于您一次又一次地调用相同的选择器,请确保您同时在队列中最多只保留30个操作。 NSOperationQueue Class Reference

答案 2 :(得分:0)

由于我找不到解决方案,而其他滚动视图委托方法也不好,我是通过基于滚动视图的内容偏移进行限制来实现的,如评论中所建议的那样。 (例如:如果用户滚动超过3个像素,则仅调用它)。

这是一个不错的解决方案,因为我怀疑有人可以每秒滚动超过90个像素,而STILL会在这90个像素之间读取文本。

if (ABS(self.oldOffset.y - webView.scrollView.contentOffset.y) > 3) {
    [captureView setNeedsDisplay];
}

答案 3 :(得分:-1)

无法控制委托方法的调用,也没有参数来设置委托方法调用的频率或设置scrollview的灵敏度,

你无法控制它。

唯一剩下的就是忽略调用(如果你不需要那么在函数调用开始时返回)或者处理调用..