Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading iOS-默认情况下在哪个队列选择器上运行?_Multithreading_Thread Safety_Handler_Uialertcontroller - Fatal编程技术网

Multithreading iOS-默认情况下在哪个队列选择器上运行?

Multithreading iOS-默认情况下在哪个队列选择器上运行?,multithreading,thread-safety,handler,uialertcontroller,Multithreading,Thread Safety,Handler,Uialertcontroller,假设,我正在从主踏板显示一个UIAlertController,比如myAlertmyAlert有一个操作,defaultAction。我想知道默认情况下,defaultActions处理程序是否在主队列上运行。换句话说,我想知道下面代码中的doStuff中是否有一些与UI相关的操作,我是否需要用主队列包装这些UI任务,还是操作系统保证它在主队列中运行 UIAlertController* myAlert = [UIAlertController alertControllerWithTitle

假设,我正在从主踏板显示一个
UIAlertController
,比如
myAlert
myAlert
有一个操作,
defaultAction
。我想知道默认情况下,
defaultAction
s处理程序是否在主队列上运行。换句话说,我想知道下面代码中的
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更新发送到主队列。

谢谢您的回答。我改了题目。我还假设像您所说的,
操作闭包将在主队列上运行,因为它是用户交互的结果。我想知道是否有任何关于这些的文件或线索。可能在某处有文件记录,但这只是常识;您不需要将
@IBAction
中的UI代码分派到主队列,因为主队列是负责UI@Paulw11This这绝对不是常识,苹果有一个与UI相关的闭包历史,在主线程上永远不保证(有时也不保证)回调。如果有证据支持此声明,请链接文档和测试。请向我展示一个案例,说明用户与UIControl的交互不会导致操作处理程序在mai队列上运行。@Paulw11 UIAltertController操作已知有一个副作用,即在首次启动回调时在单独的线程上随机运行。无论如何,除非您能够提供文档证明UI组件的所有回调都在主线程上运行,否则行为是未定义的。即使您编写了一个测试来证明对于指定版本的iOS来说这是正确的,但当它没有文档记录时,它仍然是未定义的。你现在正在做一个假设,这是非常危险的。真正的说法可能是:“根据我的经验,我似乎没有在后台线程上返回与UI相关的回调”。