我想了解运行循环。这是编码的最佳方式?
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];
}
});
答案 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。