iOS - 在哪个队列选择器中 运行 默认打开?

iOS - In which queue selectors run on by default?

假设,我正在展示 UIAlertController,比如 myAlert,来自主要部分。 myAlert 有一个动作,defaultAction。我想知道 defaultActions 处理程序是否默认在主队列上 运行s。换句话说,我想知道在下面的代码中 doStuff 里面是否有一些 UI 相关的操作,我是否需要用主队列包装这些 UI 任务或者保证 运行 在主队列中 OS?

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];

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

一个对象是 "thread safe" 如果它可以从多个线程 accessed/modified 没有问题。

你的问题的答案是,动作闭包将 运行 在主队列上,因为它是由用户交互产生的,所以你不需要显式地将 UI 更新分派到主队列排队。