Невозможно использовать ForEach для отдельных записей из coredata

#core-data #swiftui

Вопрос:

У меня есть таблица, содержащая 20 песен от 5 разных исполнителей , это число может увеличиваться и уменьшаться, теперь мне нужно представление, в котором я могу отображать навигацию по этим уникальным певцам с их изображениями, которые также находятся в таблице.

Поэтому мне нужны только отдельные записи, основанные на имени исполнителя , я запрашиваю coredata, но когда я использую его в представлении, я получаю Generic struct 'ForEach' requires that 'NSFetchRequest<NSDictionary>' conform to 'RandomAccessCollection'

Теперь, чтобы преодолеть это, я использую id:.self, это тоже не работает.

Теперь я читаю и узнаю , что ForEach не любит любой ТИП, который не отсортирован, но я не смог найти способ обойти это, может ли кто-нибудь любезно предложить какие-либо решения, спасибо.

Вот как я извлекаю уникальные записи из основных данных

 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)
                           
                            }
                            
                           
                        
                            }
                        
                      
                    }
                }
            

    }
}


        
 

Комментарии:

1. Разве вы не хотите выполнить forEach «результат» выборки вместо «команды выборки»?

2. @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
      ...
    }
 

Комментарии:

1. Я , должно быть, делаю что — то не так, но в моем коде , когда я это делаю-ForEach(fetchRequest.сортированный(по:>), идентификатор: .ключ) { ключ, значение в, я получаю множество ошибок, таких как Ссылка инициализатора ‘init(_:идентификатор:содержимое:)’ на ‘ForEach’ требует, чтобы ‘Ссылка навигации><ZStack<_>, песни исполнителей<_>>’ соответствовали ‘TableRowContent’, Значение типа ‘NSFetchRequest<_>><NSDictionary>’ не имеет члена «сортировка» и т. Д., Это значит, что запрос coredata неверен ?

2. обновил свой ответ с возможным подходом.

3. Извините, что я решил эту проблему сейчас, большое спасибо, это помогает мне лучше понимать коллекции