I’m working on a SwiftUI app where I save a playlist to a database in the background. The issue I’m facing is that after saving a new playlist, the main view does not reflect this change immediately. The new playlist only appears after I restart the app.
Issue Description
I have a DataManager that handles data operations and a DataManagerBackgroundActor that saves the playlist in the background. The app’s main view is supposed to display all saved playlists, but it doesn’t update immediately after a new playlist is added.
After adding a new playlist, I expect the Home view to immediately display the newly added playlist.
Manager files:
import Foundation
import SwiftData
@Observable class DataManager {
private var context: ModelContext
init(with container: ModelContainer) {
context = ModelContext(container)
}
}
@ModelActor
actor DataManagerBackgroundActor {
private var modelContext: ModelContext
init(modelContainer: ModelContainer) {
self.modelContext = ModelContext(modelContainer)
}
func savePlaylist(lista: PlayListModel, completion: @escaping (_ stage: DownloadStage) -> Void) async throws {
modelContext.insert(lista)
try modelContext.save()
completion(.done)
}
}
import SwiftUI
import SwiftData
@main
struct MyApp: App {
let sharedModelContainer: ModelContainer
@State private var dm: DataManager
init() {
let schema = Schema([PlayListModel.self])
let modelConfiguration = ModelConfiguration("PlaylistsDB", schema: schema, isStoredInMemoryOnly: false, allowsSave: true)
self.sharedModelContainer = try! ModelContainer(for: schema, configurations: [modelConfiguration])
self.dm = DataManager(with: sharedModelContainer)
}
var body: some Scene {
WindowGroup {
ContentView()
.modelContainer(sharedModelContainer)
.environment(dm)
}
}
}
import SwiftUI
import SwiftData
struct ContentView: View {
@Environment(DataManager.self) private var dm
var body: some View {
Home()
}
}
import SwiftUI
import SwiftData
struct Home: View {
@Query var playlist: [PlayListModel]
@State var openAddPlayList = false
var body: some View {
NavigationStack {
if playlist.isEmpty {
VStack {
Text("Please Insert a new Playlist")
Button("Add Playlist") {
openAddPlayList.toggle()
}
}
} else {
List(playlist) { playlist in
Text(playlist.playlistName)
}
}
}
.fullScreenCover(isPresented: $openAddPlayList) {
AddNewPlaylist()
}
}
}
import SwiftUI
import SwiftData
struct AddNewPlaylist: View {
@Environment(.dismiss) var dismiss
@State private var playlistName = "TV"
@State private var playlistUrl = "https://iptv-org.github.io/iptv/index.country.m3u"
@Environment(DataManager.self) private var dm: DataManager
var body: some View {
VStack {
TextField("Playlist Name", text: $playlistName)
TextField("M3U Link", text: $playlistUrl)
Button("Save Playlist") {
let playlist = PlayListModel(timestamp: Date(), playlistName: playlistName, playlistUrl: playlistUrl, lastUpdate: Date(), haveFile: false)
Task {
let actor = DataManagerBackgroundActor(modelContainer: dm.context.container)
try await actor.savePlaylist(lista: playlist) { stage in
if stage == .done {
dismiss()
}
}
}
}
}
.padding()
}
}