0

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方法(或等效方法)可能会被调用数百次......作为一个极端的例子。但这是处理延迟/排队方法调用的一种更简单的方法,因此如果它不会对性能产生重大影响,我更愿意使用它。

4

0 回答 0