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相关的回调”。