我有一个控制某些资源的功能,例如:
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()
}
除了竞争条件外,我可以在这种情况下遇到一些线程问题吗? 例如,如果两个函数都试图同时更改资源
答案 0 :(得分:4)
全局调度队列是并发,,因此无法保护 从多个线程同时调用你的函数。
如果您想序列化对资源的访问权限,那么您必须这样做 创建串行队列:
UIApplication
然后,按顺序执行调度到此队列的所有工作项:
DispatchQueue.main.async {
// working with UIApplication.shared
}
另请注意,In [1]: data
Out[1]:
Name item Wk1 price Wk2 price Wk1 units Wk2 units
Vehicle Car 978 966 100 120
- 仅作为UI相关资源 - 必须
可以在主线程上访问:
In [2]: data.melt(id_vars = ['Name', 'item'])
Out[2]:
Name item variable value
0 Vehicle Car Wk1 price 978
1 Vehicle Car Wk2 price 966
2 Vehicle Car Wk1 units 100
3 Vehicle Car Wk2 units 120
Xcode还有“Thread Sanitizer”和“主线程检查器”选项 (在方案设置的“诊断”窗格中)可以提供帮助 检测线程问题。