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
}