如何在iOS编程中保持方法执行的顺序?

如何在iOS编程中保持方法执行的顺序?,ios,objective-c,multithreading,camera,uilabel,Ios,Objective C,Multithreading,Camera,Uilabel,因此,目前我正在iOS上开发一个摄像头应用程序。通常,当在屏幕上单击“捕获”按钮时,它将执行以下操作: 在屏幕上显示“保存…”标签 [camManager captureStillImage]//捕获图像 从屏幕上删除ui标签“保存…” 问题是,“保存…”标签从未出现在屏幕上。但是,当我删除步骤3时,标签实际上会出现在屏幕上,但在捕获图像之后 根据我的理解,这可能是因为第2步执行得太快,或者是由于多线程导致这些步骤不能保证按照我编写的顺序执行。这是正确的吗 如果是这样,我如何保证此标签在捕获前立

因此,目前我正在iOS上开发一个摄像头应用程序。通常,当在屏幕上单击“捕获”按钮时,它将执行以下操作:

  • 在屏幕上显示“保存…”标签
  • [camManager captureStillImage]//捕获图像
  • 从屏幕上删除
    ui标签
    “保存…”
  • 问题是,“保存…”标签从未出现在屏幕上。但是,当我删除步骤3时,标签实际上会出现在屏幕上,但在捕获图像之后

    根据我的理解,这可能是因为第2步执行得太快,或者是由于多线程导致这些步骤不能保证按照我编写的顺序执行。这是正确的吗

    如果是这样,我如何保证此标签在捕获前立即出现,在捕获后立即消失


    代码
    你正在阻塞主线程

    主线程负责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];
            });
        });
    }