我有一个控制某些资源的函数,例如:
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()
}在这种情况下,除了种族条件之外,我还能得到一些线程问题吗?例如,如果这两个函数同时尝试更改资源
发布于 2018-05-26 15:23:12
全局分派队列是并发的,因此不能保护您的函数不被多个线程同时调用。
如果您想序列化对资源的访问,那么必须创建一个串行队列:
let myQueue = DispatchQueue(label: "myQueue", qos: .userInitiated)然后按顺序执行发送到此队列的所有工作项:
myQueue.async {
changeSomeResources()
}还请注意,UIApplication - as是一个与UI相关的资源- must,只能在主线程上访问:
DispatchQueue.main.async {
// working with UIApplication.shared
}Xcode还有“线程清除器”和“主线程检查器”选项(在方案设置的“诊断”窗格中),可以帮助检测线程问题。
https://stackoverflow.com/questions/50543782
复制相似问题