我performSelector:withObject:afterDelay:
用来延迟布局操作,以便它不会多次完成。通常,我会做这样的事情(仅示例):
- (void) setViewNeedsLayout{
if (!_viewsNeedLayout){
_viewsNeedLayout = YES;
[self performSelector:@selector(layoutViews) withObject:nil afterDelay:0];
}
}
- (void) layoutViews{
_viewsNeedLayout = NO;
//layout views
}
它非常简单、高效且有效地将布局操作延迟到当前运行循环结束,但它确实需要我跟踪 ivar: _viewsNeedLayout
。
但是,我想知道cancelPreviousPerformRequestsWithTarget:selector:object:
. 与其使用 iVar 来跟踪我是否启动了延迟选择器,我想知道这样做是否会更好:
- (void) setViewNeedsLayout{
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(layoutViews) object:nil];
[self performSelector:@selector(layoutViews) withObject:nil afterDelay:0];
}
现在,问题是性能如何cancelPreviousPerformRequestsWithTarget
?在某些情况下,相应的setViewNeedsLayout
方法(或等效方法)可能会被调用数百次......作为一个极端的例子。但这是处理延迟/排队方法调用的一种更简单的方法,因此如果它不会对性能产生重大影响,我更愿意使用它。