Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
试图在GCD-iOS中同时运行两个进程_Ios_Multithreading_Grand Central Dispatch - Fatal编程技术网

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

试图在GCD-iOS中同时运行两个进程,ios,multithreading,grand-central-dispatch,Ios,Multithreading,Grand Central Dispatch,我正试图通过iOS中的GCD在后台同时加载两组数据。目前,我构建了两个不同的并发队列,在其中运行每个任务。但是,完成第一个队列和第二个队列(运行相同强度的任务)之间的延迟非常大(因此我假设它们不是同时运行的)。你们对如何解决这个问题有什么建议吗?我不完全理解正确的方法。谢谢 dispatch_queue_t myQueue = dispatch_queue_create("com.a.identifier", DISPATCH_QUEUE_CONCURRENT); dispatch_queue_

我正试图通过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];

    });
});

它们很可能同时运行。它们可能不是并行运行的。GCD提供并发性,但很少承诺并行性。许多库都是如此(通常是更重要的特性)

你们有多少核?如果您只有一个内核,那么第二个作业等待第一个作业完成也就不足为奇了。如果您有两个核心,但是主队列有很多工作要做,那么它很可能在您的一个块之前得到优先级。您应该在Instruments中使用GCD工具来探索事情何时得到安排(
printf
在这里也是一个强大的工具)。记住,上下文切换需要时间。为了在核心上获得最佳吞吐量,您需要在其上运行一件事情,直到该事情完成,然后运行下一件事情。来回切换使它们一起完成将使它们运行得更慢。大多数系统偏向于吞吐量。没有理由为了运行相同优先级的块而交换一个块

你知道两个工作同时获得数据吗?如果你是从网络中撤出,很可能一个比另一个来得早或快得多。您可能在单个连接上进行管道连接,这可能会序列化您的网络流量。当数据到达时,您应该记录。您还应该记录块实际启动的时间(在块顶部放置一个
printf()

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

你真的需要深入了解什么是跑步,什么时候跑步。这种症状有时可能意味着您正在其他地方的后台线程上更新UI。这可能会导致获得正确更新的长时间延迟(可能与此代码无关)。输入
printf()
语句和使用工具对于确保您了解实际情况非常重要


如果调整速度比吞吐量更重要(您的建议是这样的),您可能希望将作业分解成更小的部分,并将它们交错起来。

它们很可能同时运行。它们可能不是并行运行的。GCD提供并发性,但很少承诺并行性。许多库都是如此(通常是更重要的特性)

你们有多少核?如果您只有一个内核,那么第二个作业等待第一个作业完成也就不足为奇了。如果您有两个核心,但是主队列有很多工作要做,那么它很可能在您的一个块之前得到优先级。您应该在Instruments中使用GCD工具来探索事情何时得到安排(
printf
在这里也是一个强大的工具)。记住,上下文切换需要时间。为了在核心上获得最佳吞吐量,您需要在其上运行一件事情,直到该事情完成,然后运行下一件事情。来回切换使它们一起完成将使它们运行得更慢。大多数系统偏向于吞吐量。没有理由为了运行相同优先级的块而交换一个块

你知道两个工作同时获得数据吗?如果你是从网络中撤出,很可能一个比另一个来得早或快得多。您可能在单个连接上进行管道连接,这可能会序列化您的网络流量。当数据到达时,您应该记录。您还应该记录块实际启动的时间(在块顶部放置一个
printf()

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

你真的需要深入了解什么是跑步,什么时候跑步。这种症状有时可能意味着您正在其他地方的后台线程上更新UI。这可能会导致获得正确更新的长时间延迟(可能与此代码无关)。输入
printf()
语句和使用工具对于确保您了解实际情况非常重要


如果步调比吞吐量更重要(您的建议是这样的),您可能希望将作业分成更小的部分,并将其交错进行。

完成之间有一个延迟-因此一组加载,然后在10秒后加载下一组。我试着让两个集合几乎同时加载。在完成之间有一个延迟-所以一个集合加载,然后在10秒后加载下一个集合。我正试图让电视机几乎同时上映。