iOS:如何在不相互干扰的情况下执行我的块



我有一个我正在尝试创建的过程,我在其中下载不同的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]; });

正在使用的代码的完整版本如下,但根据我的日志输出发生的情况是它们同时执行(如果我正确理解一切,我得到的目的有点);但是,它们的代码从未真正完成......我无法判断是否通过日志输出解析了所有内容,并且主屏幕保持冻结状态。 日志仅显示它应该显示的部分日志...似乎被另一个进程的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];
    });
});

听起来您希望它们按顺序执行,并在它们进行时更新 UI。如果是这样,您可以使用串行队列:

dispatch_queue_t serialQueue = dispatch_queue_create("com.company.MyQueue", NULL);
dispatch_async(serialQueue,^ { 
    dispatch_async(dispatch_get_main_queue(), ^{
        [self setBottomBarToUpdating:@"Updating Persons..."];
    }
    [self updatePersons]; 
});
dispatch_async(serialQueue,^ { 
    dispatch_async(dispatch_get_main_queue(), ^{
        [self setBottomBarToUpdating:@"Updating Places..."];
    }
    [self updatePlaces]; 
});
dispatch_async(serialQueue,^ { 
    dispatch_async(dispatch_get_main_queue(), ^{
        [self setBottomBarToUpdating:@"Updating Positions..."];
    }
    [self updatePositions]; 
});
dispatch_async(serialQueue,^ { 
    dispatch_async(dispatch_get_main_queue(), ^{
        [self setBottomBarToUpdating:@"Updating Contacts..."];
    }
    [self updateContacts]; 
    dispatch_async(dispatch_get_main_queue(), ^{
        [self setBottomBarToUpdating:@"Finished updating"];
    }
});
dispatch_release(serialQueue);

相关内容

最新更新