Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
54 changes: 38 additions & 16 deletions ClashX/Views/ProxyGroupSpeedTestMenuItem.swift
Original file line number Diff line number Diff line change
Expand Up @@ -94,27 +94,49 @@ private class ProxyGroupSpeedTestMenuItemView: MenuItemBaseView {
enclosingMenuItem?.isEnabled = false
setNeedsDisplay()

ApiRequest.getGroupDelay(groupName: group.name) {
[weak self] delays in
guard let self = self, let menu = self.enclosingMenuItem else { return }

group.all?.forEach { proxyName in
// Create a dispatch group to track all proxy tests
let dispatchGroup = DispatchGroup()

// Start testing each proxy individually
group.all?.forEach { proxyName in
dispatchGroup.enter()

ApiRequest.getProxyDelay(proxyName: proxyName) { delay in
defer { dispatchGroup.leave() }

guard let menu = self.enclosingMenuItem else { return }
var delayStr = NSLocalizedString("fail", comment: "")
var delay = 0
if let d = delays[proxyName], d != 0 {
delayStr = "\(d) ms"
delay = d
var delayValue = 0
if delay != 0 {
delayStr = "\(delay) ms"
delayValue = delay
}

NotificationCenter.default.post(
name: .speedTestFinishForProxy,
object: nil,
userInfo: ["proxyName": proxyName,
"delay": delayStr,
"rawValue": delay])

// Update UI on main thread
DispatchQueue.main.async {
// Update menu items directly
if let proxyMenu = menu.submenu {
for item in proxyMenu.items {
if let proxyItem = item as? ProxyMenuItem, proxyItem.proxyName == proxyName {
proxyItem.updateDelay(delayStr, rawValue: delayValue)
}
}
}

// Post notification for other observers
NotificationCenter.default.post(
name: .speedTestFinishForProxy,
object: nil,
userInfo: ["proxyName": proxyName,
"delay": delayStr,
"rawValue": delayValue])
}
}
}

// When all tests are complete
dispatchGroup.notify(queue: .main) { [weak self] in
guard let self = self, let menu = self.enclosingMenuItem else { return }
self.label.stringValue = menu.title
menu.isEnabled = true
self.setNeedsDisplay()
Expand Down
2 changes: 1 addition & 1 deletion ClashX/Views/ProxyMenuItem.swift
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ class ProxyMenuItem: NSMenuItem {
}
}

private func updateDelay(_ delay: String?, rawValue: Int?) {
public func updateDelay(_ delay: String?, rawValue: Int?) {
if enableShowUsingView {
(view as? ProxyItemView)?.update(str: delay, value: rawValue)
} else {
Expand Down