并发和串行的异步任务

时间:2017-10-05 04:13:19

标签: swift asynchronous grand-central-dispatch

我不确定标题是否合适,但我会尽力解释我的意思。

所以我有这样的代码:

func syncData(forUser user: User, endPoints: [EndPoint]) {
    serialQueue.async{
        for endPoint in endPoints {
            // download the data in the internet using the provided endPoint (API). This may take longer to finish depends on the connection speed and data begin downlod
        }
    }
}

此方法“连续”执行多项任务。每个用户的任务应该“连续”完成,因为它们相互依赖,这种方法可以正常工作,从互联网上下载数据。

问题在于下载数据需要时间。假设user1执行数据下载并且该过程需要时间来完成,而user1的任务正在处理user2也执行数据下载。由于user1尚未完成,因此user2必须等待,直到user1完成所有操作。因此,user2的进度条保持为0,直到完成所有user1。

有没有办法对user1和user2的所有任务进行分组(单独),仍然可以串行完成。每个小组应该同时进行,  所以每个小组在执行任务之前不会等待另一个小组完成。

1 个答案:

答案 0 :(得分:1)

根据每个用户的唯一ID为每个用户创建一个单独的队列。然后在此函数中,在分配给该特定用户的队列上运行您的代码。

您可以维护所有队列的数组。当用户请求操作时,查看他们是否已在阵列中为其分配了队列。如果是,则将任务放入该队列中。如果没有,则创建一个新队列,将其分配给该用户并将任务放在其上。