Makes it so we don't have to wait for all servers to be connected before fetching

This commit is contained in:
2020-04-30 23:36:37 -07:00
parent 1bad5ae5b0
commit 1cfdf3552f
4 changed files with 42 additions and 49 deletions
+27 -17
View File
@@ -26,8 +26,10 @@ class WemoServer : Server
{
private var devices: [WemoDevice] = []
public var connected: Bool { get { return self.connectionStatus == .connected } }
fileprivate(set) var baseURL: URL
fileprivate(set) var connected: Bool = false
fileprivate(set) var connectionStatus: ConnectionStatus = .disconnected
fileprivate var _urlSession: URLSession
fileprivate var _errorStream: StandardErrorOutputStream = StandardErrorOutputStream()
@@ -45,15 +47,16 @@ class WemoServer : Server
func connect(_ completion: @escaping (Error?) -> Void)
{
if (!self.connected) {
if (self.connectionStatus == .disconnected) {
let op = ConnectOperation(baseURL: self.baseURL, session: _urlSession)
weak var weakOp = op
op.completionBlock = {
guard let strongOp = weakOp else { completion(nil) ; return }
if let error = strongOp.error {
self._logError("Error connecting to server", error: error)
self.connectionStatus = .disconnected
} else {
self.connected = true
self.connectionStatus = .connected
}
completion(strongOp.error)
@@ -66,27 +69,34 @@ class WemoServer : Server
func disconnect(_ completion: (Error?) -> Void)
{
self.connected = false
self.connectionStatus = .disconnected
completion(nil)
}
func fetchDevices(_ completion: @escaping (Result<[AnyDevice], Error>) -> Void)
{
if (self.connected) {
let op = FetchDevicesOperation(baseURL: self.baseURL, session: _urlSession)
weak var weakOp = op
op.completionBlock = {
guard let strongOp = weakOp else { return }
if let error = strongOp.error {
self._logError("Error fetching devices", error: error)
completion(.failure(error))
} else {
self.devices = strongOp.devices
}
let op = FetchDevicesOperation(baseURL: self.baseURL, session: _urlSession)
weak var weakOp = op
op.completionBlock = {
guard let strongOp = weakOp else { return }
if let error = strongOp.error {
self._logError("Error fetching devices", error: error)
completion(.failure(error))
} else {
self.devices = strongOp.devices
completion(.success(self.devices.map { AnyDevice($0) }))
}
self.devices = strongOp.devices
completion(.success(self.devices.map { AnyDevice($0) }))
}
if self.connectionStatus == .disconnected {
connect { error in
if error == nil {
self._operationQueue.addOperation(op)
}
}
} else if self.connectionStatus == .connected {
_operationQueue.addOperation(op)
} else {
completion(.failure(ConnectionError.serverUnavailable))