具有并发和串行的异步任务
Async task with concurrent and serially
我不确定标题是否合适,但我会尽力解释我的意思。
所以我有这样的代码:
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
}
}
}
此方法执行任务数 "serially"。每个用户的任务都应该完成 "serially" 因为它们相互依赖并且这种方法可以正常工作,它可以从互联网上下载数据。
问题是下载数据需要时间。假设 user1 执行数据下载并且该过程需要时间才能完成,而 user1 的任务正在处理 user2 也执行数据下载。由于 user1 尚未完成,因此 user2 将不得不等待,直到 user1 的一切都完成。因此,我的 user2 进度条保持为 0,直到所有 user1 完成。
有没有办法将 user1 和 user2 的所有任务(分别)分组,并且仍然按顺序完成。而且每组要同时进行,
这样每组就不会等到另一组完成后再执行任务。
根据每个用户的唯一 ID 创建一个单独的队列。然后在这个函数中,运行 你的代码在分配给该特定用户的队列中。
或
您可以维护一个包含所有队列的数组。当用户请求一个动作时,查看他们是否已经在数组中分配了一个队列。如果是,则将任务放入该队列。如果没有,则创建一个新队列,将其分配给该用户并将任务放在上面。
我不确定标题是否合适,但我会尽力解释我的意思。
所以我有这样的代码:
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
}
}
}
此方法执行任务数 "serially"。每个用户的任务都应该完成 "serially" 因为它们相互依赖并且这种方法可以正常工作,它可以从互联网上下载数据。
问题是下载数据需要时间。假设 user1 执行数据下载并且该过程需要时间才能完成,而 user1 的任务正在处理 user2 也执行数据下载。由于 user1 尚未完成,因此 user2 将不得不等待,直到 user1 的一切都完成。因此,我的 user2 进度条保持为 0,直到所有 user1 完成。
有没有办法将 user1 和 user2 的所有任务(分别)分组,并且仍然按顺序完成。而且每组要同时进行, 这样每组就不会等到另一组完成后再执行任务。
根据每个用户的唯一 ID 创建一个单独的队列。然后在这个函数中,运行 你的代码在分配给该特定用户的队列中。
或
您可以维护一个包含所有队列的数组。当用户请求一个动作时,查看他们是否已经在数组中分配了一个队列。如果是,则将任务放入该队列。如果没有,则创建一个新队列,将其分配给该用户并将任务放在上面。