Fixed: make SpeedDataRecorder thread safe

This commit is contained in:
yicheng 2018-12-22 20:44:01 +08:00
parent a1f5ea4700
commit 9c90310294
3 changed files with 20 additions and 4 deletions

View File

@ -60,7 +60,7 @@ class MenuItemFactory {
let selected = proxy.stringValue == selectedName
proxyItem.state = selected ? .on : .off
if let delay = SpeedDataRecorder.shared.speedDict[proxy.stringValue] {
if let delay = SpeedDataRecorder.shared.getDelay(proxy.stringValue) {
let menuItemView = ProxyMenuItemView.create(proxy: proxy.stringValue, delay: delay)
menuItemView.isSelected = selected
menuItemView.onClick = { [weak proxyItem] in

View File

@ -12,5 +12,22 @@ class SpeedDataRecorder {
static let shared = SpeedDataRecorder()
private init(){}
var speedDict = [String:Int]()
private let queue = DispatchQueue(label: "clashx.SpeedDataRecorder")
private var speedDict = [String:Int]()
func getDelay(_ proxyName:String) -> Int? {
var delay:Int?
queue.sync { [weak self] in
delay = self?.speedDict[proxyName]
}
return delay
}
func setDelay(_ proxyName:String,delay:Int?) {
queue.async(group: nil, qos: .default, flags: DispatchWorkItemFlags.barrier) {
[weak self] in
self?.speedDict[proxyName] = delay
}
}
}

View File

@ -105,8 +105,7 @@ class JsBridgeUtil {
} else {
resp = delay
}
SpeedDataRecorder.shared.speedDict[proxyName] = delay
SpeedDataRecorder.shared.setDelay(proxyName, delay: delay)
responseCallback?(resp)
}
} else {