Ios 什么时候应该使用信号量、调度组和操作队列?

Ios 什么时候应该使用信号量、调度组和操作队列?,ios,swift,multithreading,Ios,Swift,Multithreading,什么时候应该使用信号量、调度组和操作队列 我的理解是: 使用信号量:当多个线程想要访问共享资源时 使用调度组:如果需要,在所有线程(添加到调度组)完成其执行后,应该会通知您 使用操作队列:当您希望操作C在A和B完成执行后启动时。所以A和B对C有依赖关系 我的理解正确与否?我想大家都在关注这三种技术管理工作单元之间依赖关系的能力。总之,信号量是一种低级工具,调度组代表更高级别的抽象,而操作队列则更高级 一些意见: 一般来说,信号量是一种低级工具,应该谨慎使用,因为它们很容易被误用(例如,容易意外

什么时候应该使用信号量、调度组和操作队列

我的理解是:

使用信号量:当多个线程想要访问共享资源时

使用调度组:如果需要,在所有线程(添加到调度组)完成其执行后,应该会通知您

使用操作队列:当您希望操作C在A和B完成执行后启动时。所以A和B对C有依赖关系


我的理解正确与否?

我想大家都在关注这三种技术管理工作单元之间依赖关系的能力。总之,信号量是一种低级工具,调度组代表更高级别的抽象,而操作队列则更高级

一些意见:

  • 一般来说,信号量是一种低级工具,应该谨慎使用,因为它们很容易被误用(例如,容易意外导致死锁,容易阻塞主线程等)。几乎总是有更好、更高级的工具

    例如,在执行同步时,锁和GCD队列通常不仅提供更高级别的接口,而且效率也更高

  • 分派组是一个略高级别的工具,是在一系列分派的代码块完成时通知您的好方法。因此,如果您已经在使用GCD,调度组是一个合理的解决方案

    注意,我建议避免使用
    wait
    函数(无论是信号量还是调度组格式副本)。改用调度组
    notify
    方法的模式。信号量的缺点是存在意外死锁、阻塞主线程等风险。调度组的
    wait
    功能只会重新引入一些相同的潜在问题。但是使用
    notify
    时很难出错

  • 操作队列是更高级别的工具。是的,您可以像您概述的那样管理依赖关系,但您也可以执行更一般的“按顺序运行一系列异步操作”或“一次运行一系列异步操作,但不能超过x个操作”。这是管理一系列异步任务的好方法

    但操作不仅仅是管理一系列异步工作单元的一种方式。另一个好处是,它提供了一个已建立的框架,可以将工作单元封装在离散对象中。这可以帮助我们在代码中实现更好的职责分离。因此,您可以拥有用于网络操作的队列、用于图像处理操作的队列等,并避免出现这样的情况,例如,我们将所有这些代码都隐藏在视图控制器(lol)中

因此,作为一种严重的过度简化,我建议:

  • 完全避免使用信号灯
  • 如果您希望在一组已调度的代码块完成时收到通知,请使用调度组;及
  • 如果您想要将复杂的异步代码抽象为不同的对象,或者对于异步任务具有更复杂的依赖关系/并发场景,请考虑操作队列

会给你一些想法。我注意到你不接受任何问题的答案。如果您想接受问题的答案,不仅要投票,还要单击旁边的复选标记。看见