使用调度组时如何使公共资源线程安全?

帕万

我有一个User类,每次用户打开应用程序时都需要更新

class User : NSObject, NSCoding {
    var vehicles : [Vehicles]
    var bankaccounts : [BankAccounts]
    var friends : [Friends]
}

在主屏幕ViewController中,我有一个使用3个Alamofire请求从后端获取数据的函数。最后,我将数据保存在UserDefaults中。DispatchGroup是实现此目标的第一件事。这是代码

func loadUserData {
    var user = User()

    let userDataDispatchGroup = DispatchGroup()

    userDataDispatchGroup.enter()
    AF.request(...).responseJSON {
        //update the user.vehicles array
        userDataDispatchGroup.leave()
    }
    
    userDataDispatchGroup.enter()
    AF.request(...).responseJSON {
        //update the user.bankaccounts array
        userDataDispatchGroup.leave()
    }

    userDataDispatchGroup.enter()
    AF.request(...).responseJSON {
        //update the user.friends array
        userDataDispatchGroup.leave()
    }

    userDataDispatchGroup.notify(queue: .main) {
        let encodedData  = NSKeyedArchiver.archivedData(withRootObject: user)
        UserDefaults.standard.set(encodedData, forKey: "user")
    }

}

但是我不清楚用户对象的线程安全性。由于它将在三个不同的回调中进行更新,因此线程安全在这里会成为问题吗?如果是,解决问题的最佳方法是什么?我当时在考虑使用DispatchSemaphore。但是我不确定这是否正确。

你问:

但是我不清楚用户对象的线程安全性。由于它将在三个不同的回调中进行更新,因此线程安全在这里会成为问题吗?

您的代码段中没有线程安全问题,因为Alamofire在主线程上调用其完成处理程序。他们这样做是为了缓解多线程问题。DispatchQueue.main.async在这种情况下,不需要任何操作如Alamofire文档所述

.main默认情况下,传递到响应处理程序的闭包在队列上执行,但是DispatchQueue可以传递特定的内容来执行闭包。

因此,除非您进行了不寻常的操作(例如,.main使用一些并发来覆盖默认队列DispatchQueue),否则Alamofire将在主线程上运行其完成处理程序,从而减轻了线程安全性的顾虑。

如果您使用的另一个API没有在主线程上调用其完成处理程序(例如URLSession.shared,在后台队列上调用其完成处理程序),则可能会有所顾虑,但Alamofire则不会。(甚至URLSession使用串行后台队列,因此使用模式更新本地变量时不会出现问题。)

最重要的是,只要您不同时从多个线程中更改/访问一个变量,就可以大大缓解线程安全问题。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

多线程。如何平等地共享公共资源?

来自分类Dev

如何为几个项目使用公共资源(项目依赖项)?

来自分类Dev

如何同步不同的Java程序以访问公共资源

来自分类Dev

Puppet:如何在模块中共享公共资源/变量

来自分类Dev

不共享公共资源的线程是否有可能基于线程ID /名称进行通知?

来自分类Dev

使用 Kendo 调度程序资源分组时查找插槽的组

来自分类Dev

如何在Laravel中将私人资源映射为公共资源?

来自分类Dev

静态属性中的公共资源

来自分类Dev

静态属性中的公共资源

来自分类Dev

春季启动网络和公共资源

来自分类Dev

Spring 库共享公共资源

来自分类Dev

如何将公共资源包含到typo3 extbase扩展中

来自分类Dev

如何将VPC内的AWS Lambda函数连接到DynamoDB等公共资源?

来自分类Dev

Laravel 5:如何启用基于环境的公共资源,如CSS,JS,图像

来自分类Dev

如何将公共资源密集型对象传递给子类?

来自分类Dev

为什么Github页面网址在加载时发生更改,从而导致公共资源路径不正确?

来自分类Dev

导入python,两个模块共享公共资源

来自分类Dev

在Symfony2中使用另一个捆绑软件中的公共资源

来自分类Dev

如何使用调度组同时开始加载?

来自分类Dev

从公共资源为自定义ViewGroup的多个组件创建StateListDrawables

来自分类Dev

新贡献者未显示在公共资源库中

来自分类Dev

正确的URI语法,用于引用DLL中的公共资源文件

来自分类Dev

流星铁路由器:在内部路线中加载公共资源

来自分类Dev

IBM Worklight控制台预览公共资源链接错误:找不到

来自分类Dev

使用调度组时,异步功能需要很长时间

来自分类Dev

使用 OpenMP 循环时的线程安全

来自分类Dev

使用@Async 注释时的线程安全

来自分类Dev

调度组-无法通知主线程

来自分类Dev

调度组-无法通知主线程

Related 相关文章

  1. 1

    多线程。如何平等地共享公共资源?

  2. 2

    如何为几个项目使用公共资源(项目依赖项)?

  3. 3

    如何同步不同的Java程序以访问公共资源

  4. 4

    Puppet:如何在模块中共享公共资源/变量

  5. 5

    不共享公共资源的线程是否有可能基于线程ID /名称进行通知?

  6. 6

    使用 Kendo 调度程序资源分组时查找插槽的组

  7. 7

    如何在Laravel中将私人资源映射为公共资源?

  8. 8

    静态属性中的公共资源

  9. 9

    静态属性中的公共资源

  10. 10

    春季启动网络和公共资源

  11. 11

    Spring 库共享公共资源

  12. 12

    如何将公共资源包含到typo3 extbase扩展中

  13. 13

    如何将VPC内的AWS Lambda函数连接到DynamoDB等公共资源?

  14. 14

    Laravel 5:如何启用基于环境的公共资源,如CSS,JS,图像

  15. 15

    如何将公共资源密集型对象传递给子类?

  16. 16

    为什么Github页面网址在加载时发生更改,从而导致公共资源路径不正确?

  17. 17

    导入python,两个模块共享公共资源

  18. 18

    在Symfony2中使用另一个捆绑软件中的公共资源

  19. 19

    如何使用调度组同时开始加载?

  20. 20

    从公共资源为自定义ViewGroup的多个组件创建StateListDrawables

  21. 21

    新贡献者未显示在公共资源库中

  22. 22

    正确的URI语法,用于引用DLL中的公共资源文件

  23. 23

    流星铁路由器:在内部路线中加载公共资源

  24. 24

    IBM Worklight控制台预览公共资源链接错误:找不到

  25. 25

    使用调度组时,异步功能需要很长时间

  26. 26

    使用 OpenMP 循环时的线程安全

  27. 27

    使用@Async 注释时的线程安全

  28. 28

    调度组-无法通知主线程

  29. 29

    调度组-无法通知主线程

热门标签

归档