【发布时间】:2019-12-09 10:28:01
【问题描述】:
情况:
我有 2 个任务,分别是 T1 和 T2 处于异步后台模式。 T2 依赖于 T1 并具有 successBlock,在 T1 和 两个任务完成后执行T2.
下面是快速图表以便更好地理解。
编辑:
为了更好地理解任务,您可以假设 T1 和 T2 是始终以异步模式执行的 API 调用。我需要一些来自 T1 的输出数据来访问 T2 API。完成这两项任务后,我需要更新 UI。
为了完成这个场景,我在 T1 中添加了我的第一个异步工作,在 T2 中添加了第二个工作以及 T2 到 的依赖项>T1 和 successblock 都依赖于这两个任务。
代码工作
-
我的任务
class TaskManager { static let shared = TaskManager() func task1Call(complete: @escaping ()->()) { DispatchQueue.global(qos: .background).async { for i in 0...10 { print("~~> Task 1 Executing ..", i) sleep(1) } complete() } } func task2Call(complete: @escaping ()->()) { DispatchQueue.global(qos: .background).async { for i in 0...10 { print("==> Task 2 Executing ..", i) sleep(1) } complete() } } } -
执行任务
class Execution { // Managing tasks with OperationQueue func executeTaskWithOperation() { let t1 = BlockOperation { TaskManager.shared.task1Call { print("Task 1 Completed") } } let t2 = BlockOperation { TaskManager.shared.task2Call { print("Task 2 Completed") } } let successBlock = BlockOperation { print("Tasks Completed") } let oper = OperationQueue() t2.addDependency(t1) successBlock.addDependency(t2) successBlock.addDependency(t1) oper.addOperations([t1, t2, successBlock], waitUntilFinished: true) } } let e = Execution() e.executeTaskWithOperation()
问题:
两个任务并行执行,successBlock在任务 1 和任务 2 完成之前执行。
控制台输出:
==> Task 2 Executing .. 0
Tasks Completed
~~> Task 1 Executing .. 0
~~> Task 1 Executing .. 1
==> Task 2 Executing .. 1
==> Task 2 Executing .. 2
~~> Task 1 Executing .. 2
==> Task 2 Executing .. 3
~~> Task 1 Executing .. 3
==> Task 2 Executing .. 4
~~> Task 1 Executing .. 4
==> Task 2 Executing .. 5
~~> Task 1 Executing .. 5
==> Task 2 Executing .. 6
~~> Task 1 Executing .. 6
==> Task 2 Executing .. 7
~~> Task 1 Executing .. 7
==> Task 2 Executing .. 8
~~> Task 1 Executing .. 8
==> Task 2 Executing .. 9
~~> Task 1 Executing .. 9
~~> Task 1 Executing .. 10
==> Task 2 Executing .. 10
Task 1 Completed
Task 2 Completed
我无法弄清楚我在做什么错,即使是相同的代码在我使用同步模式而不是异步时也能正常工作。
【问题讨论】:
-
所以你希望它以串行方式,为什么不使用 dispatchGroup 调用呢?在您的队列中,我没有看到正在运行的队列有任何暂停,这不会阻止 NSOperation 在当前进程进入差异线程后获取下一个进程
-
@Joshua ,对不起,我不明白 在你的队列中我没有看到正在运行的队列中有任何暂停,这不会阻止 NSOperation 在当前进程执行后获取下一个进程到一个差异线程
-
哦,我的意思是它并没有阻止 NSOperation 在您的示例中执行下一个进程 [t1, t2] t1 在进入后台的那一刻执行并进入后台,没有任何信息通知 NSOperation等待它完成,然后再进行下一个过程(t2)。同步通过阻塞当前线程直到它完成来防止这种情况发生。如果您想要更多控制,我建议使用 GroupDispatchQueue 甚至 DispatchSemaphore
-
@Joshua 谢谢哥们,它起作用了,我添加了结论答案。如果以防万一,您需要在我的答案中添加更多分数,请添加。
-
很高兴我设法给你一个想法。欢呼
标签: ios swift asynchronous nsoperationqueue