@@ -3,6 +3,7 @@ import Foundation
33import Darwin
44
55/// MDNSBrowser discovers HTTP services on the local network and publishes resolved URLs.
6+ @MainActor
67final class MDNSServiceBrowser : NSObject {
78 static let shared = MDNSServiceBrowser ( )
89
@@ -26,22 +27,18 @@ final class MDNSServiceBrowser: NSObject {
2627 }
2728
2829 func startBrowsing( ) {
29- DispatchQueue . main. async {
30- guard !self . isBrowsing else { return }
31- self . isBrowsing = true
32- self . discoveredURLs. removeAll ( )
33- self . netServiceBrowser. searchForServices ( ofType: self . serviceType, inDomain: self . domain)
34- }
30+ guard !isBrowsing else { return }
31+ isBrowsing = true
32+ discoveredURLs. removeAll ( )
33+ netServiceBrowser. searchForServices ( ofType: serviceType, inDomain: domain)
3534 }
3635
3736 func stopBrowsing( ) {
38- DispatchQueue . main. async {
39- guard self . isBrowsing else { return }
40- self . isBrowsing = false
41- self . netServiceBrowser. stop ( )
42- self . servicesResolving. removeAll ( )
43- self . discoveredURLs. removeAll ( )
44- }
37+ guard isBrowsing else { return }
38+ isBrowsing = false
39+ netServiceBrowser. stop ( )
40+ servicesResolving. removeAll ( )
41+ discoveredURLs. removeAll ( )
4542 }
4643
4744 private func cleanup( service: NetService ) {
@@ -130,51 +127,45 @@ extension MDNSServiceBrowser {
130127 }
131128}
132129
133- extension MDNSServiceBrowser : NetServiceBrowserDelegate {
130+ extension MDNSServiceBrowser : @ preconcurrency NetServiceBrowserDelegate {
134131 func netServiceBrowser( _ browser: NetServiceBrowser , didFind service: NetService , moreComing: Bool ) {
135- DispatchQueue . main. async {
136- if !self . servicesResolving. contains ( service) {
137- self . servicesResolving. insert ( service)
138- service. delegate = self
139- service. resolve ( withTimeout: 5.0 )
140- }
132+ if !servicesResolving. contains ( service) {
133+ servicesResolving. insert ( service)
134+ service. delegate = self
135+ service. resolve ( withTimeout: 5.0 )
141136 }
142137 }
143138
144139 func netServiceBrowser( _ browser: NetServiceBrowser , didRemove service: NetService , moreComing: Bool ) {
145- DispatchQueue . main. async {
146- self . servicesResolving. remove ( service)
147- if let urlString = self . urlString ( from: service) {
148- self . discoveredURLs. remove ( urlString)
149- }
140+ servicesResolving. remove ( service)
141+ if let urlString = urlString ( from: service) {
142+ discoveredURLs. remove ( urlString)
150143 }
151144 }
152145
153146 func netServiceBrowserDidStopSearch( _ browser: NetServiceBrowser ) {
154- DispatchQueue . main . async { self . isBrowsing = false }
147+ isBrowsing = false
155148 }
156149
157150 func netServiceBrowser( _ browser: NetServiceBrowser , didNotSearch errorDict: [ String : NSNumber ] ) {
158- DispatchQueue . main . async { self . isBrowsing = false }
151+ isBrowsing = false
159152 }
160153}
161154
162- extension MDNSServiceBrowser : NetServiceDelegate {
155+ extension MDNSServiceBrowser : @ preconcurrency NetServiceDelegate {
163156 func netServiceDidResolveAddress( _ sender: NetService ) {
164- DispatchQueue . main. async {
165- guard self . servicesResolving. contains ( sender) else { self . cleanup ( service: sender) ; return }
166- guard self . isCodexMeterService ( sender) else { self . cleanup ( service: sender) ; return }
167- guard let urlString = self . urlString ( from: sender) else { self . cleanup ( service: sender) ; return }
168- if !self . discoveredURLs. contains ( urlString) {
169- self . discoveredURLs. insert ( urlString)
170- self . discoveryPublisher. send ( ( urlString, sender. name) )
171- }
172- self . cleanup ( service: sender)
157+ guard servicesResolving. contains ( sender) else { cleanup ( service: sender) ; return }
158+ guard isCodexMeterService ( sender) else { cleanup ( service: sender) ; return }
159+ guard let urlString = urlString ( from: sender) else { cleanup ( service: sender) ; return }
160+ if !discoveredURLs. contains ( urlString) {
161+ discoveredURLs. insert ( urlString)
162+ discoveryPublisher. send ( ( urlString, sender. name) )
173163 }
164+ cleanup ( service: sender)
174165 }
175166
176167 func netService( _ sender: NetService , didNotResolve errorDict: [ String : NSNumber ] ) {
177- DispatchQueue . main . async { self . cleanup ( service: sender) }
168+ cleanup ( service: sender)
178169 }
179170
180171 func netService( _ sender: NetService , didUpdateTXTRecord data: Data ) {
0 commit comments