无法将 ForEach 用于来自 coredata 的不同记录

Posted

技术标签:

【中文标题】无法将 ForEach 用于来自 coredata 的不同记录【英文标题】:Unable to use ForEach for distinct records from coredata 【发布时间】:2021-09-26 10:36:12 【问题描述】:

我有一个表格,其中包含来自 5 位不同艺术家的 20 首歌曲,这个数字可以上下浮动,现在我想要一个视图,我可以在其中显示这些独特歌手的导航,他们的图像也在表格中。

所以我只需要基于艺术家姓名的不同记录,我查询 coredata 但是当我在 View 中使用它时,我得到Generic struct 'ForEach' requires that 'NSFetchRequest<NSDictionary>' conform to 'RandomAccessCollection'

现在为了克服这个问题,我使用 id:.self,这也不起作用。

现在我阅读并了解到 ForEach 不喜欢任何未排序的 TYPE,但我无法找到解决此问题的方法,任何人都可以提出任何解决方案,谢谢。

这就是我从核心数据中获取唯一记录的方式

let fetchRequest: NSFetchRequest<NSDictionary> = NSFetchRequest(entityName: "Artists")
    
    
    init(songLVM: Binding<SongListVM>)

    _songLVM = songLVM
        
    fetchRequest.propertiesToFetch = ["artistname"]
    fetchRequest.returnsDistinctResults = true
    fetchRequest.resultType = .dictionaryResultType
        
    

下面是整个文件

import Foundation
import SwiftUI
import CoreData

struct ArtistList: View 
    @Environment(\.managedObjectContext) var managedObjectContext
    @Binding var songLVM: SongListVM
    @State var namesFilter = [String]()
    
    
    //-----
    let fetchRequest: NSFetchRequest<NSDictionary> = NSFetchRequest(entityName: "Artists")
    
    
    init(songLVM: Binding<SongListVM>)

    _songLVM = songLVM
        
    fetchRequest.propertiesToFetch = ["artistname"]
    fetchRequest.returnsDistinctResults = true
    fetchRequest.resultType = .dictionaryResultType
        
    
    
    
    //-----
    
   
    
    
    var body: some View 
   
        
            List 
               
                ForEach(fetchRequest)  <---- Error here 
                    idx in
                
                    NavigationLink(
                        destination: ArtistSongs(artistName: idx.artistname ?? "no name", songLVM: $songLVM)) 

                            
                            ZStack(alignment: .bottomTrailing)  
                            
                           
                                Image(uiImage: UIImage(data: idx.artistImage ?? Data()) ?? UIImage())
                                    .resizable()
                                    .frame(width: 350, height: 350, alignment: .center)
                                    
                                Text(idx.artistname ?? "no name")
                                   
                                    .font(Font.system(size: 50, design: .rounded))
                                    .foregroundColor(.white)
                           
                            
                            
                           
                        
                            
                        
                      
                    
                
            

    



        

【问题讨论】:

你不想在 fetch 的“结果”而不是“fetch 命令”上做一个forEach 吗? @Larme,谢谢,你想让我将艺术家 1 转移到其他变量,然后为演示中的每个项目做一个循环吗? 【参考方案1】:

一旦你弄清楚你的字典是什么,在你的ForEach循环中试试这个:

ForEach(dict.sorted(by: >), id: \.key)  key, value in
    ...

编辑1:

    @FetchRequest(sortDescriptors: [NSSortDescriptor(keyPath: \Artists.artistname, ascending: true)],
                  animation: .default)
    private var artists: FetchedResults<Artists>

    ...
    
    ForEach(artists, id: \.self)  artist in
      ...
    

【讨论】:

我一定做错了,但在我的代码中,当我这样做时 - ForEach(fetchRequest.sorted(by: >), id: \.key) key, value in ,我得到多个'ForEach' 上的引用初始化程序 'init(_:id:content:)' 等错误要求 'NavigationLink, ArtistSongs>' 符合 'TableRowContent','NSFetchRequest' 类型的值没有成员'sorted'等,是coredata查询不正确吗? 用一种可能的方法更新了我的答案。 对不起,我现在解决了,非常感谢,它帮助我更好地理解 Collections

以上是关于无法将 ForEach 用于来自 coredata 的不同记录的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SwiftUI 中从 FetchedResults (CoreData) 中获取 NSOrderedSet

使用 SwiftUI ForEach 从 NSOrderedSet 获取字符串值

当 ForEach 中发生 onDelete 时如何更新其他 CoreData?

无法从 CoreData 加载 5 个随机数据以用于 Widget,有啥想法可以支持吗?

Core Data + iCloud 如何处理来自云端的数据更新

显示来自 Observable Object SwiftUI 的列表