0

我有一个在后台线程中执行的代码,它正在执行某种计算并且在一个 do-while 循环中。由于需求的一些变化,我必须显示一个 UI 来提示用户输入。这段UI代码要在主线程中完成,输入提示后,逻辑需要继续。在主线程上使用 dispatch_async,我可以显示 UI,但步骤 -2 不应该继续,直到 UI 完成。在不破坏代码流并将单元移动到块中的情况下,实现此目的的最佳方法是什么?

例如:

-(void) compute
{
    do 
    {
        //calculate some data
        // Step -1...
        ...
        // Step -2
         ...
         ...
     } while(flag)
}

在步骤 1 和步骤 2 之间,我想显示一个提示。最好的方法是什么?可以在 UI 完成后由主线程使用互斥锁来阻止这个后台线程吗?

4

2 回答 2

1

为此,我将使用 GCD(Grand Central Dispatch)。您可以使用 dispatch_sync(或 dispatch_async)轻松地在主线程上同步(或异步执行)执行块。我个人在我的 EX2Kit 库 ( https://github.com/einsteinx2/EX2Kit ) 中使用我的包装类 EX2Dispatch,但它是一回事。

例如,您将执行以下操作:

dispatch_sync(dispatch_get_main_queue(), ^{
    // Do some stuff to the UI
};

编辑:

我正在阅读它,因为需要根据之前的计算向用户显示信息,但是如果在继续之前需要用户的响应,那么循环需要在显示警报后中断,然后再次调用。

您可以使用实例变量来跟踪您在循环中的距离,以便它可以在 UIAlertView 的按钮单击委托方法中的同一点恢复。

于 2013-03-02T03:05:38.090 回答
0

尝试这个

dispatch_queue_t mainQueue = dispatch_get_main_queue(); 
dispatch_async(mainQueue, ^(void) {

    //do stuff here

    });
于 2013-03-02T03:45:50.990 回答