【问题标题】:iOS - In which queue selectors run on by default?iOS - 默认情况下在哪些队列选择器上运行?
【发布时间】:2017-04-12 01:21:19
【问题描述】:

假设,我从主胎面展示一个UIAlertController,比如myAlertmyAlert 有一个动作,defaultAction。我想知道defaultActions 处理程序是否默认在主队列上运行。换句话说,我想知道下面代码中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];

【问题讨论】:

    标签: multithreading thread-safety handler uialertcontroller


    【解决方案1】:

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

    如果可以从多个线程访问/修改对象而不会出现问题,则该对象是“线程安全的”。

    您的问题的答案是,动作闭包将在主队列上运行,因为它是用户交互的结果,因此您无需将 UI 更新显式分派到主队列。

    【讨论】:

    • 感谢您的回答。我更改了问题标题。我也假设像你所说的那样,action closure will run on the main queue as it results from a user interaction。我想知道这些方面是否有任何文件或线索。
    • 它可能记录在某处,但这只是常识;您不需要将@IBAction 中的 UI 代码分派到主队列,因为主队列是负责 UI 的队列
    • @Paulw11这绝对不是常识,Apple 有与 UI 相关的闭包历史,这些闭包从不保证(有时不保证)在主线程上回调。如果有证据支持这一说法,请链接文档和测试。
    • 请向我展示一个用户与 UIControl 交互不会导致操作处理程序在 mai 队列上运行的情况。
    • @Paulw11 UIAltertController 操作已知会在首次启动时在回调上随机运行在单独的线程上产生副作用。无论如何,除非您可以提供文档证明 UI 组件的所有回调都在主线程上运行,否则行为是未定义的。即使您编写了一个测试来证明这对于指定的 iOS 版本是正确的,但当它没有记录时,它仍然是未定义的。你现在正在做一个假设,这是非常危险的。一个真实的陈述可能是:“根据我的经验,我似乎没有在后台线程上返回与 UI 相关的回调”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-18
    • 2015-03-05
    相关资源
    最近更新 更多