You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 15:10:55