diff --git a/MongoView/MongoController.swift b/MongoView/MongoController.swift index 75164b3..1ab0bf7 100644 --- a/MongoView/MongoController.swift +++ b/MongoView/MongoController.swift @@ -9,6 +9,7 @@ import Foundation import MongoSwift import NIO +import Combine class MongoController { let connectionString: String @@ -17,12 +18,7 @@ class MongoController { var client: MongoClient! - var status: Status = .connecting { - didSet { - statusDidChange.forEach { $0(status) } - } - } - var statusDidChange = [(Status) -> Void]() + @Published var status: ConnectionStatus = .connecting init(connectionString: String) { self.connectionString = connectionString @@ -40,7 +36,7 @@ class MongoController { do { client = try MongoClient(connectionString, using: group) - status = .success + status = .connected } catch { status = .failed print("Failed to connect to Mongo: \(error)") @@ -58,7 +54,7 @@ class MongoController { } extension MongoController { - enum Status { - case connecting, success, failed + enum ConnectionStatus { + case connecting, connected, failed } } diff --git a/MongoView/Windows/DatabaseWindowController.swift b/MongoView/Windows/DatabaseWindowController.swift index 75b127e..104219f 100644 --- a/MongoView/Windows/DatabaseWindowController.swift +++ b/MongoView/Windows/DatabaseWindowController.swift @@ -7,6 +7,7 @@ // import Cocoa +import Combine class DatabaseWindowController: NSWindowController { @@ -21,6 +22,8 @@ class DatabaseWindowController: NSWindowController { private var databaseViewController: DatabaseViewController! + private var statusDidChangeHandler: Cancellable? + convenience init() { self.init(windowNibName: "DatabaseWindowController") } @@ -32,17 +35,15 @@ class DatabaseWindowController: NSWindowController { if setupMongo { mongoController = MongoController(connectionString: "mongodb://localhost:27017") } - mongoController.statusDidChange.append({ [weak self] (status) in - guard let self = self else { return } - self.updateStatusText(status) - - if status == .success { - DispatchQueue.main.async { + statusDidChangeHandler = mongoController.$status + .receive(on: DispatchQueue.main) + .sink { (status) in + self.updateStatusText(status) + + if status == .connected { self.initializeUI() } } - }) - self.updateStatusText(mongoController.status) if setupMongo { mongoController.setup() } @@ -65,14 +66,14 @@ class DatabaseWindowController: NSWindowController { window?.title = databaseViewController?.title ?? "MongoView" } - private func updateStatusText(_ status: MongoController.Status) { + private func updateStatusText(_ status: MongoController.ConnectionStatus) { guard let statusView = self.statusView else { return } switch status { case .connecting: statusView.setText("Connecting...") case .failed: statusView.setText("Failed to connect") - case .success: + case .connected: statusView.setText("Connected to \(self.mongoController.connectionString)") } }