我正在尝试创建一个过程,在该过程中下载不同的xml文件并从网站解析它们。目前,我可以通过使用...让他们完成所有工作。

dispatch_async(dispatch_get_current_queue(),^ { [self updatePersons]; });
dispatch_async(dispatch_get_current_queue(),^ { [self updatePlaces]; });
dispatch_async(dispatch_get_current_queue(),^ { [self updatePositions]; });
dispatch_async(dispatch_get_current_queue(),^ { [self updateContacts]; });


这会锁定主线程,因为我正在使用dispatch_get_current_queue。尝试以下方法时,如何才能在不中断的情况下使它们执行。

dispatch_async(dispatch_get_global_queue(0,0),^ { [self updatePersons]; });


我正在使用的代码的完整版本如下,但是根据我的Log输出所发生的事情是它们同时执行(如果我理解正确的话,我得到的就是这个目的);但是,它们的代码从未真正完成...我无法通过日志输出判断所有内容是否已解析,并且主屏幕保持冻结。该日志仅显示应显示的部分日志...似乎被其他进程的NSLog消息打断了。

dispatch_async(dispatch_get_global_queue(0,0),^ { [self updatePersons]; });
dispatch_async(dispatch_get_global_queue(0,0),^ { [self updatePlaces]; });
dispatch_async(dispatch_get_global_queue(0,0),^ { [self updatePositions]; });
dispatch_async(dispatch_get_global_queue(0,0),^ { [self updateContacts]; });

dispatch_async(dispatch_get_global_queue(-2,0),^ {

            dispatch_async(dispatch_get_main_queue(),^  {[self setBottomBarToUpdated]; });
 });


我正在尝试为应用创建一种通过上述每个功能提取信息的方法,同时通过底部栏上的标签向用户更新进度。我可以通过在四个函数中的每个函数中使用以下代码来更新文本,使其工作正常。

dispatch_async(dispatch_get_main_queue(),^ {
         [self setBottomBarToUpdating:@"Updating Places..."];
});


如果有人可以为使用队列的正确方式提供帮助,以使我的应用无法锁定,我将不胜感激。谢谢!

最佳答案

如果创建自己的私有并发调度队列,则可以使用“屏障块”。仅当所有其他先前提交的块完成时才执行该块。

dispatch_queue_t queue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_CONCURRENT);

// These blocks are executed concurrently:
dispatch_async(queue, ^ { [self updatePersons]; });
dispatch_async(queue, ^ { [self updatePlaces]; });
// ...

dispatch_barrier_async(queue, ^ {
    // This will be executed when all previous blocks are finished.
    dispatch_async(dispatch_get_main_queue(), ^{
        [self setBottomBarToUpdated];
    });
});

关于ios - iOS:如何在不互相干扰的情况下执行块?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11954074/

10-14 22:04
查看更多