SwiftData在iOS17与iOS18下的表现差异排查求助
问题:iOS18中SwiftData新增歌曲延迟显示
我是SwiftUI开发新手,应用接近完成正在微调阶段,发现使用SwiftData时iOS18版本出现异常表现。我认为问题可能出在自身实现上,但始终无法找到解决办法,已花费大量时间,感到有些沮丧。
SwiftData模型定义
Song模型
@Model class Song: Codable { var uuid: UUID = UUID() var text: String = "" var creationDate: Date = Date.now var updatingDate: Date = Date.now var status: Int = 0 var nbRead: Int = 0 var speed: Float = 0.5 var language: String = "" enum CodingKeys: CodingKey { case uuid, text, creationDate, updatingDate, status, nbRead, speed, language } @Relationship(inverse: \Genre.songs) var genres: [Genre]? init(uuid: UUID, text: String, creationDate: Date, updatingDate: Date, status: Int, nbRead: Int, speed: Float, language: String) { self.uuid = uuid self.text = text self.creationDate = creationDate self.updatingDate = updatingDate self.status = status self.nbRead = nbRead self.speed = speed self.language = language } func encode(to encoder: Encoder) throws { var container = encoder.container(keyedBy: CodingKeys.self) try container.encode(uuid, forKey: .uuid) try container.encode(text, forKey: .text) try container.encode(creationDate, forKey: .creationDate) try container.encode(updatingDate, forKey: .updatingDate) try container.encode(status, forKey: .status) try container.encode(nbRead, forKey: .nbRead) try container.encode(speed, forKey: .speed) try container.encode(language, forKey: .language) } required init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) uuid = try container.decode(UUID.self, forKey: .uuid) text = try container.decode(String.self, forKey: .text) creationDate = try container.decode(Date.self, forKey: .creationDate) updatingDate = try container.decode(Date.self, forKey: .updatingDate) status = try container.decode(Int.self, forKey: .status) nbRead = try container.decode(Int.self, forKey: .nbRead) speed = try container.decode(Float.self, forKey: .speed) language = try container.decode(String.self, forKey: .language) } }
Genre模型
@Model class Genre { var name: String = "" var color: String = "Red" var songs: [Song]? init( name: String, color: String) { self.name = name self.color = color } }
歌曲列表视图代码
import SwiftData import SwiftUI struct SongsListView: View { private var searchingText: String @Environment(\.modelContext) private var modelContext @Query(sort: \Genre.name) private var genres: [Genre] @Query var songs : [Song] init(searchText: String) { if !searchText.isEmpty { let predicate = #Predicate<Song> { song in song.text.localizedStandardContains(searchText) } _songs = Query(filter: predicate) } searchingText = searchText } var body: some View { HStack{ List{ if !songs.isEmpty { ForEach(genres, id: \.name){ genre in Section(header: Text(genre.name)){ ForEach (songs){song in if let songGenres = song.genres { if songGenres.contains(genre){ NavigationLink { SongView(song: song) } label: { Text(song.text) } } } } } } .onDelete { indexSet in indexSet.forEach { index in let song = songs[index] modelContext.delete(song) } } Section(header: Text("Without Genre")) { ForEach (songs){song in if let songGenres = song.genres { if songGenres.isEmpty{ NavigationLink { SongView(song: song) } label: { Text(song.text) } } } } .onDelete { indexSet in indexSet.forEach { index in let song = songs[index] modelContext.delete(song) } } } } } .scrollContentBackground(.hidden) } } }
主视图代码
import SwiftData import SwiftUI struct MainView: View { enum AddOrEdit { case add, edit } @State private var searchText = "" @Environment(\.modelContext) private var modelContext @Environment(\.dismiss) private var dismiss var option: AddOrEdit var body: some View { VStack{ ZStack{ HStack{ Text("Songs").bold() .padding(.leading) Spacer() } HStack{ Spacer() Button(action: { dismiss() }, label: { Image(systemName: "xmark.circle.fill") .padding(.trailing) }) } } NavigationStack { ZStack{ SongsListView(searchText: searchText) .searchable(text: $searchText, prompt:"Search for a song...") } Button { modelContext.insert(Song(uuid: UUID(), text: "New song", creationDate: Date(), updatingDate: Date(), status: 0, nbRead: 0, speed: Float(1.0), language: "fr-FR")) }label: { Image(systemName: "plus.circle.fill") //.imageScale(.large) .font(.title) } } .offset(y: -10) .scrollContentBackground(.hidden) } } }
异常现象
在iOS17中,创建新歌曲后会直接显示在「无分类」区域的列表中;但在iOS18中,新歌曲需要等待约30秒才会添加到列表中。我尝试分步排查问题,虽考虑过改用Core Data,但更希望通过SwiftData解决该问题并理解原因。
内容的提问来源于stack exchange,提问作者boujouman
相关产品推荐
相关产品推荐

