调用dispatch_async一次或多次更有效

时间:2016-03-22 19:08:29

标签: objective-c multithreading cocoa-touch

我想了解运行循环。这是编码的最佳方式?

for (UIView *view in self.viewSet) { 
    dispatch_async(dispatch_get_main_queue(), ^{
        [view removeFromSuperview];
    });
}

dispatch_async(dispatch_get_main_queue(), ^{
    for (UIView *view in self.viewSet) { 
        [view removeFromSuperview];
    }
});

2 个答案:

答案 0 :(得分:3)

要具体回答这个问题,它会分解为工作单元的大小。如果你将一大块工作分配给主线程,那么那个大块将在它处理的整个时间内阻塞主线程。如果你向主线程发送了一大堆非常小的工作,那么主线程将把处理工作块与其他事件的处理交错,这将使你的应用程序效率稍低,但整体反应更快。

然而,在问题的上下文中,dispatch_async()模式可能都不是你真正想要的。你真的不应该从任何超级视图中删除大量的视图,无论是一次性还是在主队列中交错。

相反,您应该有一个容器视图,其中包含需要换出的视图 - 可能由视图控制器管理 - 并且您应该删除一个 removeFromSuperview那个容器。一旦删除,那么确实不需要手动删除任何容器视图,因为您应该定义保留/弱所有权规则,这样您就不会有通过视图的循环 - >子视图关系。

或者,简洁地说:

dispatch_async(.. main queue .., ^{
    [_myContainerView removeFromSuperview];
});

在理想的世界中,removeFromSuperview会删除对_myContainerView的最后一次引用,然后它会自动拆除UIKit认为合适的子视图的层次结构。< / p>

答案 1 :(得分:1)

第一个

for (UIView *view in self.viewSet) { 
    dispatch_async(dispatch_get_main_queue(), ^{
        [view removeFromSuperview];
    });
}

在主线程上排队一堆[view removeFromSuperview]个调用。循环结束后,它们一次执行一个。每次通话都会等待,直到主队列清除,就像火车等待进入车站一样。

第二个

dispatch_async(dispatch_get_main_queue(), ^{
    for (UIView *view in self.viewSet) { 
        [view removeFromSuperview];
    }
});

一个事物排队到主线程上,即整个循环。一旦主线程空闲,就会运行一段代码,其中所有视图都被删除,kaboom。