我有一个我正在尝试创建的进程,我下载不同的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..."];
});
如果有人可以提供正确使用队列的帮助,那么我的应用程序不会锁定,我会非常感激。谢谢!
答案 0 :(得分:3)
如果您创建自己的专用并发调度队列,则可以使用“屏障块”。只有在完成所有其他先前提交的块时,才会执行此块。
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];
});
});
答案 1 :(得分:0)
听起来您希望它们按顺序执行,并在UI进行时更新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);