Skip to content

Commit be3f14a

Browse files
committed
Fixes discovering servers when calling ServerManager.startDiscovering() from background thread
1 parent 7d634cd commit be3f14a

File tree

1 file changed

+16
-8
lines changed

1 file changed

+16
-8
lines changed

Sources/AltKit/Server/ServerManager.swift

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ public class ServerManager: NSObject
4949
// Allow other AltKit queues to target this one.
5050
internal let dispatchQueue = DispatchQueue(label: "io.altstore.altkit.ServerManager", qos: .utility, autoreleaseFrequency: .workItem)
5151

52-
private let serviceBrowser = NetServiceBrowser()
52+
private var serviceBrowser: NetServiceBrowser?
5353
private var resolvingServices = Set<NetService>()
5454

5555
private var autoconnectGroup: DispatchGroup?
@@ -59,9 +59,6 @@ public class ServerManager: NSObject
5959
{
6060
super.init()
6161

62-
self.serviceBrowser.delegate = self
63-
self.serviceBrowser.includesPeerToPeer = false
64-
6562
NotificationCenter.default.addObserver(self, selector: #selector(ServerManager.didEnterBackground(_:)), name: UIApplication.didEnterBackgroundNotification, object: nil)
6663
NotificationCenter.default.addObserver(self, selector: #selector(ServerManager.willEnterForeground(_:)), name: UIApplication.willEnterForegroundNotification, object: nil)
6764
}
@@ -75,7 +72,17 @@ public extension ServerManager
7572
guard !self.isDiscovering else { return }
7673
self.isDiscovering = true
7774

78-
self.serviceBrowser.searchForServices(ofType: ALTServerServiceType, inDomain: "")
75+
DispatchQueue.main.async {
76+
// NetServiceBrowser must be initialized on main thread.
77+
// https://stackoverflow.com/questions/3526661/nsnetservicebrowser-delegate-not-called-when-searching
78+
79+
let serviceBrowser = NetServiceBrowser()
80+
serviceBrowser.delegate = self
81+
serviceBrowser.includesPeerToPeer = false
82+
serviceBrowser.searchForServices(ofType: ALTServerServiceType, inDomain: "")
83+
84+
self.serviceBrowser = serviceBrowser
85+
}
7986
}
8087

8188
@objc
@@ -88,7 +95,8 @@ public extension ServerManager
8895
self.ignoredServers.removeAll()
8996
self.resolvingServices.removeAll()
9097

91-
self.serviceBrowser.stop()
98+
self.serviceBrowser?.stop()
99+
self.serviceBrowser = nil
92100
}
93101

94102
func connect(to server: Server, completion: @escaping (Result<ServerConnection, Error>) -> Void)
@@ -237,15 +245,15 @@ private extension ServerManager
237245

238246
self.resolvingServices.removeAll()
239247
self.discoveredServers.removeAll()
240-
self.serviceBrowser.stop()
248+
self.serviceBrowser?.stop()
241249
}
242250

243251
@objc
244252
func willEnterForeground(_ notification: Notification)
245253
{
246254
guard self.isDiscovering else { return }
247255

248-
self.serviceBrowser.searchForServices(ofType: ALTServerServiceType, inDomain: "")
256+
self.serviceBrowser?.searchForServices(ofType: ALTServerServiceType, inDomain: "")
249257
}
250258
}
251259

0 commit comments

Comments
 (0)