ios - CFRunLoopPerformBlock() 处理的 block 是什么?

标签 ios objective-c-blocks runloop

我目前正在学习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 by CFRunLoopPerformBlock()? 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 TopicsProgramming 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/

相关文章:

ios - 将图像分享到 Whatsapp 和 Facebook

ios - 如何从iOS内部返回方法对象

ios - 使用 Objective-C block 时避免泄漏的最佳做法是什么?

objective-c - 在 swift/objective-c 中以多个参数作为参数的 block

cocoa - 在cocoa编程中如何让一个函数每帧都被调用?

objective-c - 为什么 RunLoop 不会阻止整个线程执行?

ios - 自动调整 Collection View 单元格大小会忽略首次显示时的自动布局

ios - 文件未使用 NSFileProviderExtension 显示

ios - 核心数据 : Quickest way to delete all instances of an entity

macos - 始终检查 Cocoa 中的网络可达性