multithreading - iOS - 默认在哪个队列选择器上运行?

标签 multithreading thread-safety handler uialertcontroller

假设,我正在从主要部分展示一个 UIAlertController,比如 myAlertmyAlert 有一个操作,defaultAction。我想知道默认情况下 defaultAction 的处理程序是否在主队列上运行。换句话说,我想知道在下面的代码中 doStuff 中是否有一些 UI 相关的操作,我是否需要将这些 UI 任务包装在主队列中,或者操作系统保证它在主队列中运行?

UIAlertController* myAlert = [UIAlertController alertControllerWithTitle:@"My Alert"
                               message:@"This is an alert."
                               preferredStyle:UIAlertControllerStyleAlert];

UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault
   handler:^(UIAlertAction * action) {
      doStuff() // should I wrap doStuff in main queue, if doStuff has ui operations?
   }
];

[alert addAction:defaultAction];
[self presentViewController:alert animated:YES completion:nil];

最佳答案

你实际上是在问它是否在主队列上运行,而不是它是否是线程安全的。

如果可以从多个线程毫无问题地访问/修改对象,则该对象是“线程安全的”。

您的问题的答案是,操作闭包将在主队列上运行,因为它是由用户交互产生的,因此您不需要将 UI 更新显式分派(dispatch)到主队列。

关于multithreading - iOS - 默认在哪个队列选择器上运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43358685/

相关文章:

android - IntentService 内的处理程序

ios - 在 iOS 上使用 Grand Central Dispatch,如果常规 Objective-C block 不在调度队列中,它们会在哪个队列(如果有)上运行?

macos - OSX Cocoa Core-蓝牙委托(delegate)和 UI 更新线程安全

android - 即使在应用程序退出后,如何实现定时器在 Alarm Receiver 中运行?

c++ - volatile 不适合任何范式

python - 我可以从第二个线程添加 pygame 事件吗

c++ - 是否可以将处理程序附加到系统计时器?

java - Android - 非 UI 线程渲染我的 UI 无响应

multithreading - 如何编写和执行线程

java - 文件重命名时的线程安全