我目前正在学习iOS中的runloop机制。看完Run, RunLoop, Run!和 CFRunloop
源代码,我仍然对它的实际工作方式感到困惑。我的困惑之一是关于 CFRunLoopPerformBlock()
函数。很多文章都提到这个函数会把block入队,在下一个runloop中执行,但是我的问题是:这里的block是什么意思?
假设我有一个非常简单的 CustomViewController。
- (void)viewDidLoad
{
[super viewDidLoad];
UIView *redView = [[UIView alloc] initWithFrame:CGRectMake(0, 50, 100, 100)];
redView.backgroundColor = [UIColor redColor];
[self.view addSubview:redView];
}
显然这段代码中没有 block 语法。 viewDidLoad
会被 CFRunLoopPerformBlock()
调用吗?如果不是,runloop 是如何处理这个片段的?
最佳答案
Apparently there's no block syntax in this code. Will
viewDidLoad
be called byCFRunLoopPerformBlock()
? If not, how is this snippet handled by runloop?
viewDidLoad
几乎与CFRunLoopPerformBlock
无关. viewDidLoad
只是在 View 加载时、在 UI 中呈现之前在 View Controller 中调用的一个方法,以便我们有机会配置 UI。
那么什么是run loop呢?它只是一个不断运行的循环,检查各种事件(事件、计时器等)。它在每个 iOS 应用程序的幕后运行,尽管我们现在很少直接与它交互。 (异常(exception)情况可能是当我们启动某些类型的计时器时,我们将它们添加到主运行循环中。但现在就是这样。)但是当我们从 viewDidLoad
这样的方法返回时,我们将控制权交还给运行循环。
what does the block mean here?
“ block ”(在 Swift 中也称为“闭包”)只是一段要运行的代码,当此代码块存储在变量中或用作方法的参数时。 CFRunLoopPerformBlock
函数实际上说,“这里有一些代码要在运行循环的下一次迭代中运行”。该函数的第三个参数是要运行的代码,是代码的“ block ”(在 Objective-C 中,它以 ^{
开头,以最终的 }
结尾)。有关 Objective-C block 的信息,请参阅 Apple 的 Blocks Programming Topics或 Programming with Objective-C: Working with Blocks .
说了这么多,值得注意的是,人们通常不会使用 CFRunLoopPerformBlock
.如果我们想调度一段代码来运行,我们现在通常会使用 Grand Central Dispatch (GCD)。例如,下面是一些具有两个参数的代码:队列和 block :
dispatch_async(dispatch_get_main_queue(), ^{
self.label.text = @"Done";
});
同样,来自 ^{
的所有内容到 }
是第二个参数的一部分,即 block 。此代码表示“添加此代码块以更新text
”的 label
到主队列。”
关于ios - CFRunLoopPerformBlock() 处理的 block 是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57566643/