GCD swift 4线程安全

GCD swift 4线程安全,swift,grand-central-dispatch,Swift,Grand Central Dispatch,我有一个控制某些资源的功能,例如: var resource: Int? func changeSomeResources() { resource = 1 // rewriting keychain parameters // working with UIApplication.shared } 然后,我多次将此函数添加到全局线程 DispatchQueue.global(qos: .userInitiated).async { changeSomeRes

我有一个控制某些资源的功能,例如:

var resource: Int?

func changeSomeResources() {
    resource = 1
    // rewriting keychain parameters
    // working with UIApplication.shared
}
然后,我多次将此函数添加到全局线程

DispatchQueue.global(qos: .userInitiated).async {
    changeSomeResources()
}
DispatchQueue.global(qos: .userInitiated).async {
    changeSomeResources()
}
在这种情况下,除了争用条件外,我可以得到一些线程问题吗?
例如,如果两个函数同时尝试更改资源,则全局调度队列是并发的,因此不会保护资源 您的函数不会同时从多个线程调用

如果要序列化对资源的访问,则必须 创建串行队列:

然后按顺序执行分派到此队列的所有工作项:

myQueue.async {
    changeSomeResources()
}
还要注意,
UIApplication
——作为与UI相关的资源——必须 可在主线程上访问:

DispatchQueue.main.async {
    // working with UIApplication.shared
}
Xcode还有“线程清理器”和“主线程检查器”选项 (在方案设置的“诊断”窗格中)可以帮助
检测线程问题。

您是否会遇到问题完全取决于您在
changeSomeResources
中所做的操作,但您尚未显示该代码。但一般来说,是的,这可能是一个问题,这取决于您正在做什么。@rmaddy所以,我对一个简单的例子感兴趣,如果某个全局变量通过使用GCD是线程安全的,更准确地说,是通过使用DispatchQueue.async添加操作
DispatchQueue.main.async {
    // working with UIApplication.shared
}