Не знаю, что я здесь делаю не так, но я не могу заставить JobsView обновлять пользовательский интерфейс в режиме реального времени, когда я вставляю задания в таблицу. Посмотрите часть моего кода ниже. Если потребуется дополнительная информация, дайте мне знать:
JobsView.swift:
import GRDB
import Foundation
import Combine
class DatabaseManager : ObservableObject {
// The database file URL
private var dbQueue: DatabaseQueue!
//Publisher for jobs updates
@Published var jobs: [Job] = []
private var cancellables = Set()
init() {
do {
// Specify the SQLite database file location (it will create the file if it does not exist)
let fileManager = FileManager.default
let documentDirectory = fileManager.urls(for: .documentDirectory, in: .userDomainMask).first!
let dbPath = documentDirectory.appendingPathComponent("job.sqlite")
dbQueue = try DatabaseQueue(path: dbPath.path)
// Create the jobs table if it doesn't already exist
try createJobsTable()
//Observe database changes
observeJobs()
} catch {
print("Error initializing database: \(error)")
}
}
// Create jobs table
private func createJobsTable() throws {
try dbQueue.write { db in
try db.create(table: "job", ifNotExists: true) { t in
t.autoIncrementedPrimaryKey("id")
t.column("JobId", .integer)
t.column("PickTicketId", .integer)
t.column("DriverId", .integer)
t.column("InvoiceNo", .text)
t.column("CustomerName", .text)
t.column("Address1", .text)
t.column("Address2", .text)
t.column("Address3", .text)
t.column("Suburb", .text)
t.column("State", .text)
t.column("Pcode", .text)
t.column("Cartons", .integer)
t.column("Created", .text)
}
}
}
//Observe jobs table for changes and update the @Published property
private func observeJobs() {
let observation = ValueObservation.tracking() { db in
try Job.fetchAll(db) //Fetch all jobs whenever there is a change
}
observation
.publisher(in: dbQueue)
.catch { error -> Just in
print("Database observation error: \(error)")
return Just([]) // Return an empty array if there's an error
}
.receive(on: DispatchQueue.main)
.sink { [weak self] jobs in
self?.jobs = jobs
}
.store(in: &cancellables)
}
func insertJob(job: Job) {
do {
try dbQueue.write { db in
try job.insert(db) // Use GRDB's insert method
}
} catch {
print("Error inserting job: \(error)")
}
}
}
В настоящий момент представление «Вакансии» пусто, задания заполняются только при перезапуске приложения.
Не знаю, что я здесь делаю не так, но я не могу заставить JobsView обновлять пользовательский интерфейс в режиме реального времени, когда я вставляю задания в таблицу. Посмотрите часть моего кода ниже. Если потребуется дополнительная информация, дайте мне знать: JobsView.swift: [code]import SwiftUI import Combine
struct JobsView: View { @EnvironmentObject var appState: AppState
@StateObject private var webSocketManager = WebSocketManager.shared @EnvironmentObject private var databaseManager: DatabaseManager
@State private var selectedJobs: Set = [] //Tracks selected Jobs @State private var navigateToPODView: Bool = false //Controls navigation to POD view
var body: some View { NavigationStack { VStack { // List with selection from local db List(databaseManager.jobs, id: \.id, selection: $selectedJobs) { job in HStack { if selectedJobs.contains(job) { Image(systemName: "checkmark.circle.fill") .foregroundColor(Color.green) //Shows a checkmark for selected jobs }
// The database file URL private var dbQueue: DatabaseQueue!
//Publisher for jobs updates @Published var jobs: [Job] = []
private var cancellables = Set()
init() { do { // Specify the SQLite database file location (it will create the file if it does not exist) let fileManager = FileManager.default let documentDirectory = fileManager.urls(for: .documentDirectory, in: .userDomainMask).first! let dbPath = documentDirectory.appendingPathComponent("job.sqlite")
dbQueue = try DatabaseQueue(path: dbPath.path)
// Create the jobs table if it doesn't already exist try createJobsTable()
//Observe jobs table for changes and update the @Published property private func observeJobs() { let observation = ValueObservation.tracking() { db in try Job.fetchAll(db) //Fetch all jobs whenever there is a change }
observation .publisher(in: dbQueue) .catch { error -> Just in print("Database observation error: \(error)") return Just([]) // Return an empty array if there's an error } .receive(on: DispatchQueue.main) .sink { [weak self] jobs in self?.jobs = jobs } .store(in: &cancellables) }
func insertJob(job: Job) { do { try dbQueue.write { db in try job.insert(db) // Use GRDB's insert method } } catch { print("Error inserting job: \(error)") } } } [/code] В настоящий момент представление «Вакансии» пусто, задания заполняются только при перезапуске приложения.