Makes it so we don't have to wait for all servers to be connected before fetching
This commit is contained in:
@@ -272,6 +272,7 @@
|
|||||||
CreatedOnToolsVersion = 7.2;
|
CreatedOnToolsVersion = 7.2;
|
||||||
DevelopmentTeam = F7W5R35V7L;
|
DevelopmentTeam = F7W5R35V7L;
|
||||||
LastSwiftMigration = 1010;
|
LastSwiftMigration = 1010;
|
||||||
|
ProvisioningStyle = Manual;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
@@ -471,14 +472,16 @@
|
|||||||
buildSettings = {
|
buildSettings = {
|
||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||||
CLANG_ENABLE_MODULES = YES;
|
CLANG_ENABLE_MODULES = YES;
|
||||||
CODE_SIGN_IDENTITY = "iPhone Developer";
|
CODE_SIGN_IDENTITY = "Apple Distribution: Charles Magahern (F7W5R35V7L)";
|
||||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
|
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "Apple Distribution: Charles Magahern (F7W5R35V7L)";
|
||||||
|
CODE_SIGN_STYLE = Manual;
|
||||||
DEVELOPMENT_TEAM = F7W5R35V7L;
|
DEVELOPMENT_TEAM = F7W5R35V7L;
|
||||||
INFOPLIST_FILE = "$(SRCROOT)/XIONControlPanel/SupportingFiles/Info.plist";
|
INFOPLIST_FILE = "$(SRCROOT)/XIONControlPanel/SupportingFiles/Info.plist";
|
||||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
|
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = com.zanneth.XIONControlPanel;
|
PRODUCT_BUNDLE_IDENTIFIER = com.zanneth.XIONControlPanel;
|
||||||
PRODUCT_NAME = XION;
|
PRODUCT_NAME = XION;
|
||||||
PROVISIONING_PROFILE = "";
|
PROVISIONING_PROFILE = "";
|
||||||
|
PROVISIONING_PROFILE_SPECIFIER = "Octahedron II";
|
||||||
SWIFT_OBJC_BRIDGING_HEADER = "XIONControlPanel/SupportingFiles/XIONControlPanel-Bridging-Header.h";
|
SWIFT_OBJC_BRIDGING_HEADER = "XIONControlPanel/SupportingFiles/XIONControlPanel-Bridging-Header.h";
|
||||||
SWIFT_VERSION = 5.0;
|
SWIFT_VERSION = 5.0;
|
||||||
TARGETED_DEVICE_FAMILY = "1,2";
|
TARGETED_DEVICE_FAMILY = "1,2";
|
||||||
@@ -490,14 +493,16 @@
|
|||||||
buildSettings = {
|
buildSettings = {
|
||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||||
CLANG_ENABLE_MODULES = YES;
|
CLANG_ENABLE_MODULES = YES;
|
||||||
CODE_SIGN_IDENTITY = "iPhone Developer";
|
CODE_SIGN_IDENTITY = "Apple Distribution: Charles Magahern (F7W5R35V7L)";
|
||||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
|
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "Apple Distribution: Charles Magahern (F7W5R35V7L)";
|
||||||
|
CODE_SIGN_STYLE = Manual;
|
||||||
DEVELOPMENT_TEAM = F7W5R35V7L;
|
DEVELOPMENT_TEAM = F7W5R35V7L;
|
||||||
INFOPLIST_FILE = "$(SRCROOT)/XIONControlPanel/SupportingFiles/Info.plist";
|
INFOPLIST_FILE = "$(SRCROOT)/XIONControlPanel/SupportingFiles/Info.plist";
|
||||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
|
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = com.zanneth.XIONControlPanel;
|
PRODUCT_BUNDLE_IDENTIFIER = com.zanneth.XIONControlPanel;
|
||||||
PRODUCT_NAME = XION;
|
PRODUCT_NAME = XION;
|
||||||
PROVISIONING_PROFILE = "";
|
PROVISIONING_PROFILE = "";
|
||||||
|
PROVISIONING_PROFILE_SPECIFIER = "Octahedron II";
|
||||||
SWIFT_OBJC_BRIDGING_HEADER = "XIONControlPanel/SupportingFiles/XIONControlPanel-Bridging-Header.h";
|
SWIFT_OBJC_BRIDGING_HEADER = "XIONControlPanel/SupportingFiles/XIONControlPanel-Bridging-Header.h";
|
||||||
SWIFT_VERSION = 5.0;
|
SWIFT_VERSION = 5.0;
|
||||||
TARGETED_DEVICE_FAMILY = "1,2";
|
TARGETED_DEVICE_FAMILY = "1,2";
|
||||||
|
|||||||
@@ -52,7 +52,10 @@ public class HubitatServer : Server
|
|||||||
.decode(type: [HubitatDevice].self, decoder: JSONDecoder())
|
.decode(type: [HubitatDevice].self, decoder: JSONDecoder())
|
||||||
.sink(receiveCompletion: { completion in
|
.sink(receiveCompletion: { completion in
|
||||||
if case let Subscribers.Completion.failure(error) = completion {
|
if case let Subscribers.Completion.failure(error) = completion {
|
||||||
|
self.connected = false
|
||||||
fetchCompletion(.failure(error))
|
fetchCompletion(.failure(error))
|
||||||
|
} else {
|
||||||
|
self.connected = true
|
||||||
}
|
}
|
||||||
}) { (devices: [HubitatDevice]) in
|
}) { (devices: [HubitatDevice]) in
|
||||||
self.devices = devices
|
self.devices = devices
|
||||||
|
|||||||
@@ -54,10 +54,6 @@ class ServerMultiplex
|
|||||||
|
|
||||||
public func refreshDevices()
|
public func refreshDevices()
|
||||||
{
|
{
|
||||||
ensureConnection { (error: Error?) in
|
|
||||||
if let error = error {
|
|
||||||
self.handleError(error)
|
|
||||||
} else {
|
|
||||||
self.servers.forEach { (server: Server) in
|
self.servers.forEach { (server: Server) in
|
||||||
server.fetchDevices { (result: Result<[AnyDevice], Error>) in
|
server.fetchDevices { (result: Result<[AnyDevice], Error>) in
|
||||||
self.handleServerFetchResult(result)
|
self.handleServerFetchResult(result)
|
||||||
@@ -65,30 +61,9 @@ class ServerMultiplex
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
extension ServerMultiplex
|
extension ServerMultiplex
|
||||||
{
|
{
|
||||||
private func ensureConnection(then: @escaping (Error?) -> Void)
|
|
||||||
{
|
|
||||||
let disconnectedServers = servers.filter { $0.connected == false }
|
|
||||||
var disconnectedServerCount = disconnectedServers.count
|
|
||||||
|
|
||||||
if disconnectedServerCount > 0 {
|
|
||||||
disconnectedServers.forEach { (server: Server) in
|
|
||||||
server.connect { (error: Error?) in
|
|
||||||
disconnectedServerCount -= 1
|
|
||||||
if disconnectedServerCount == 0 {
|
|
||||||
then(error)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
then(nil)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private func handleServerFetchResult(_ result: Result<[AnyDevice], Error>)
|
private func handleServerFetchResult(_ result: Result<[AnyDevice], Error>)
|
||||||
{
|
{
|
||||||
switch result {
|
switch result {
|
||||||
|
|||||||
@@ -26,8 +26,10 @@ class WemoServer : Server
|
|||||||
{
|
{
|
||||||
private var devices: [WemoDevice] = []
|
private var devices: [WemoDevice] = []
|
||||||
|
|
||||||
|
public var connected: Bool { get { return self.connectionStatus == .connected } }
|
||||||
|
|
||||||
fileprivate(set) var baseURL: URL
|
fileprivate(set) var baseURL: URL
|
||||||
fileprivate(set) var connected: Bool = false
|
fileprivate(set) var connectionStatus: ConnectionStatus = .disconnected
|
||||||
|
|
||||||
fileprivate var _urlSession: URLSession
|
fileprivate var _urlSession: URLSession
|
||||||
fileprivate var _errorStream: StandardErrorOutputStream = StandardErrorOutputStream()
|
fileprivate var _errorStream: StandardErrorOutputStream = StandardErrorOutputStream()
|
||||||
@@ -45,15 +47,16 @@ class WemoServer : Server
|
|||||||
|
|
||||||
func connect(_ completion: @escaping (Error?) -> Void)
|
func connect(_ completion: @escaping (Error?) -> Void)
|
||||||
{
|
{
|
||||||
if (!self.connected) {
|
if (self.connectionStatus == .disconnected) {
|
||||||
let op = ConnectOperation(baseURL: self.baseURL, session: _urlSession)
|
let op = ConnectOperation(baseURL: self.baseURL, session: _urlSession)
|
||||||
weak var weakOp = op
|
weak var weakOp = op
|
||||||
op.completionBlock = {
|
op.completionBlock = {
|
||||||
guard let strongOp = weakOp else { completion(nil) ; return }
|
guard let strongOp = weakOp else { completion(nil) ; return }
|
||||||
if let error = strongOp.error {
|
if let error = strongOp.error {
|
||||||
self._logError("Error connecting to server", error: error)
|
self._logError("Error connecting to server", error: error)
|
||||||
|
self.connectionStatus = .disconnected
|
||||||
} else {
|
} else {
|
||||||
self.connected = true
|
self.connectionStatus = .connected
|
||||||
}
|
}
|
||||||
|
|
||||||
completion(strongOp.error)
|
completion(strongOp.error)
|
||||||
@@ -66,13 +69,12 @@ class WemoServer : Server
|
|||||||
|
|
||||||
func disconnect(_ completion: (Error?) -> Void)
|
func disconnect(_ completion: (Error?) -> Void)
|
||||||
{
|
{
|
||||||
self.connected = false
|
self.connectionStatus = .disconnected
|
||||||
completion(nil)
|
completion(nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
func fetchDevices(_ completion: @escaping (Result<[AnyDevice], Error>) -> Void)
|
func fetchDevices(_ completion: @escaping (Result<[AnyDevice], Error>) -> Void)
|
||||||
{
|
{
|
||||||
if (self.connected) {
|
|
||||||
let op = FetchDevicesOperation(baseURL: self.baseURL, session: _urlSession)
|
let op = FetchDevicesOperation(baseURL: self.baseURL, session: _urlSession)
|
||||||
weak var weakOp = op
|
weak var weakOp = op
|
||||||
op.completionBlock = {
|
op.completionBlock = {
|
||||||
@@ -87,6 +89,14 @@ class WemoServer : Server
|
|||||||
self.devices = strongOp.devices
|
self.devices = strongOp.devices
|
||||||
completion(.success(self.devices.map { AnyDevice($0) }))
|
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)
|
_operationQueue.addOperation(op)
|
||||||
} else {
|
} else {
|
||||||
completion(.failure(ConnectionError.serverUnavailable))
|
completion(.failure(ConnectionError.serverUnavailable))
|
||||||
|
|||||||
Reference in New Issue
Block a user