gpt4 book ai didi

ios - 尝试在GCD中同时运行两个进程-iOS

转载 作者:行者123 更新时间:2023-12-01 18:13:50 24 4
gpt4 key购买 nike

我正在尝试通过iOS中的GCD在后台同时加载两组数据。当前,我建立了两个不同的并发队列,在其中运行每个任务。但是,完成第一个队列和第二个队列(运行相同强度的任务)之间的延迟非常大(因此,我认为它们不是同时运行的)。你们对如何解决此问题有任何建议吗?我不完全了解解决此问题的正确方法。谢谢!

dispatch_queue_t myQueue = dispatch_queue_create("com.a.identifier", DISPATCH_QUEUE_CONCURRENT);
dispatch_queue_t myQueue2 = dispatch_queue_create("com.a.identifier2", DISPATCH_QUEUE_CONCURRENT);


dispatch_async(myQueue, ^{

[self fetchDataWithDataFromUrl:[NSURL URLWithString:linkOne]];

dispatch_async(dispatch_get_main_queue(), ^{

[self.tableView reloadData];

});

});



dispatch_async(myQueue2, ^{

[self fetchDataWithDataFromUrl2:[NSURL URLWithString:linkTwo]];


dispatch_async(dispatch_get_main_queue(), ^{

[self.tableView reloadData];

});
});

最佳答案

它们很有可能同时运行。它们可能无法并行运行。 It's important to know the difference. GCD提供并发性,它几乎没有关于并行性的 promise 。许多库都是这样(通常是更重要的功能)。

您有几个核心?如果您只有一个核心,那么第二个作业等待第一个作业完成就不足为奇了。如果您有两个核心,但是主队列有很多工作要做,那么很可能会优先考虑其中一个块。您应该使用Instruments中的GCD工具来探索事物的调度时间(printf在这里也是一个功能强大的工具)。请记住,上下文切换会花费时间。为了在内核上获得最佳吞吐量,您想在该内核上运行一件事,直到完成为止,然后再运行下一件事。来回切换以使它们一起完成将使它们的运行更加缓慢。大多数系统偏向吞吐量。没有理由为了运行相同优先级的块而换出一个块。

您知道两个作业同时获取数据吗?如果您要从网络中撤出,则很有可能一个比另一个要快得多或更快。您可能在单个连接上进行流水线操作,这可能会序列化网络流量。当数据到达时,您应该记录日志。您还应该记录您的块实际开始的时间(在块的顶部放置一个printf())。

如果您需要第一个作业在更新UI之前等待第二个作业完成,则应将两个作业都放入dispatch_group中,以便reloadData等待它们。

您确实需要深入研究运行的内容和时间。这种症状有时可能意味着您正在其他地方的后台线程上更新UI。这可能会导致获取正确更新的时间过长(可能与此代码无关)。放入printf()语句并使用Instruments对于确保您了解实际情况很重要。

如果起搏比吞吐量更重要(您建议这样做),则可能需要将工作分解成较小的部分并进行交错处理。

关于ios - 尝试在GCD中同时运行两个进程-iOS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24946039/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com