我发现我的 iOS 应用程序出现了最奇怪的行为。我有这个代码:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
CMLog(@"Start Save RoundQuestions Asynchronously");
[round saveRoundQuestions:target selector:selector];
});
该函数完成它的工作并调用它:
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
[target performSelector:selector];
#pragma clang diagnostic pop
日志显示一切正常运行,但是目标在 navigationController 上调用了 pushViewController,并且执行实际推送需要很长时间。我可以通过单击主页按钮强制它继续。我读过我可能违反了线程安全,并且可能需要唤醒运行循环。
从 dispatch_async 调用选择器是错误的吗?还是我需要在 UI 所在的主线程上执行选择器?
编辑:我实际上发现了问题。事实证明,我正在调用一个函数,该函数阻塞了 saveRoundQuestions 内的 UI,我相信这会迫使推送动画到行的后面,可以这么说。我把这个功能放在后台,推送动画现在立即发生。但我还是很好奇为什么?