如何在iOS编程中保持方法执行的顺序?
因此,目前我正在iOS上开发一个摄像头应用程序。通常,当在屏幕上单击“捕获”按钮时,它将执行以下操作:如何在iOS编程中保持方法执行的顺序?,ios,objective-c,multithreading,camera,uilabel,Ios,Objective C,Multithreading,Camera,Uilabel,因此,目前我正在iOS上开发一个摄像头应用程序。通常,当在屏幕上单击“捕获”按钮时,它将执行以下操作: 在屏幕上显示“保存…”标签 [camManager captureStillImage]//捕获图像 从屏幕上删除ui标签“保存…” 问题是,“保存…”标签从未出现在屏幕上。但是,当我删除步骤3时,标签实际上会出现在屏幕上,但在捕获图像之后 根据我的理解,这可能是因为第2步执行得太快,或者是由于多线程导致这些步骤不能保证按照我编写的顺序执行。这是正确的吗 如果是这样,我如何保证此标签在捕获前立
[camManager captureStillImage]//捕获图像
ui标签
“保存…”代码
你正在阻塞主线程 主线程负责UI内容。当您执行像
[manager captureMultipleImg]这样的长操作时代码>可能是,UI将不会得到更新。在这种情况下,您需要使用多线程
您可以在此处使用GCD
:
- (IBAction)captureImage:(id)sender {
[self showLabel];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),
^{
[manager captureMultipleImg];
// Dispatch back on main for UI stuff
dispatch_async(dispatch_get_main_queue(), ^{
[self hideLabel];
});
});
}
注意,用户界面只能从主线程中绘制。在任何情况下,我建议使用完成回调。将-captureMultipleImg
更改为-captureMultipleImageWithCompletionBlock:
,并在捕获所有图像时执行Competion block。这就是为什么[self hideLabel]
被调度回主队列的原因是的,我知道。但是你不知道里面是什么,这就是你的意思。非常感谢@NSAddict!!这解决了我的问题,也让我接触到了iOS中的多线程。我可能应该在iOS中学习更多关于GCD和多线程的知识。还感谢@Vytautas提供的提示!
- (IBAction)captureImage:(id)sender {
[self showLabel];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),
^{
[manager captureMultipleImg];
// Dispatch back on main for UI stuff
dispatch_async(dispatch_get_main_queue(), ^{
[self hideLabel];
});
});
}