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

Core Data中保存数组打乱顺序失效问题求助

Core Data打乱歌曲顺序后重新加载恢复原始顺序的解决办法

核心问题在于:你虽然更新了每个Song的order属性并保存,但重新加载数据时,没有按照order字段排序,导致Core Data默认用原始顺序返回结果。

解决步骤:

  1. 修改数据获取逻辑,按order字段排序
    找到DataManager.shared.songs(singer:)方法,添加排序规则,让返回的歌曲数组按照order属性升序排列:

    func songs(singer: Singer) -> [Song] {
        let fetchRequest: NSFetchRequest<Song> = Song.fetchRequest()
        fetchRequest.predicate = NSPredicate(format: "singer == %@", singer)
        // 新增排序描述符,按order升序排列
        let orderSort = NSSortDescriptor(key: "order", ascending: true)
        fetchRequest.sortDescriptors = [orderSort]
        
        do {
            return try persistentContainer.viewContext.fetch(fetchRequest)
        } catch {
            print("获取歌曲失败:\(error)")
            return []
        }
    }
    
  2. 确认保存逻辑有效
    检查DataManager.shared.save()方法是否正确执行了上下文保存,确保包含类似代码:

    func save() throws {
        let context = persistentContainer.viewContext
        if context.hasChanges {
            try context.save()
        }
    }
    
  3. 保留现有打乱逻辑
    你当前的打乱并更新order的代码是正确的,无需修改:

    @objc func shuffleButtonPressed() {
        print("shuffle")
        songs.shuffle()
        for (index, song) in songs.enumerated() {
            song.order = Int16(index)
        }
        do {
            try DataManager.shared.save()
            tableView.reloadData()
            print("yesr")
        } catch {
            print("保存打乱顺序失败:\(error)")
        }
    }
    

这样修改后,每次重新加载页面时,viewDidLoad里获取的songs数组会按照你保存的order顺序排列,就能保持打乱后的结果了。

内容的提问来源于stack exchange,提问作者user13990880

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 21:59:58