Mam widok modelu, który ma funkcję kontaktów:

class ContactsStore: ObservableObject {

@Published var contacts = [CNContact]()

func fetch() {} ...

A potem moim zdaniem:

@EnvironmentObject var store: ContactsStore

var groupedContacts: [String: [CNContact]] {
    .init (
        grouping: store.contacts,
        by: {$0.nameFirstLetter}
    )
}
     ...
       List() {
            ForEach(self.groupedContacts.keys.sorted(), id: \.self) { key in ...

Skróciłem mój kod dla wygody, zostanie dodany / edytuj w razie potrzeby. Problem, z którym stoiłem - za każdym razem, gdy mój widok jest wywołany funkcją fetch jest wywoływana, a moja tablica kontaktów jest zduplikowana moim zdaniem. Tia za pomoc

Updatek: Duplikacja dzieje się z powodu wywołania metody fetch na liście .onAppear. Patrzę, jak nazwać tę metodę tylko raz, a nie za każdym razem, gdy pojawi się widok.

0
Lina_F 11 styczeń 2020, 17:07

1 odpowiedź

Najlepsza odpowiedź

Możesz zrobić pobranie init () takim:

struct someView: View{
    var list: [Settings]
    init(){
        let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
        let fetchRequest: NSFetchRequest<Settings> = Settings.fetchRequest()
        //... some order and filter if you need
        self.list = context.fetch(fetchRequest)
    }
    var body: some View{
        ...
        ForEach(list){settings in
            ...
        }
        ...
    }
}

Nie próbowałem tego z grupowaniem, ale zapytałeś, jak pobrać tylko raz. Odpowiedź brzmi - w init ().

Ale nie możesz uzyskać @Environment w init, więc dostaję context z AppDelegate. Lub możesz zdać context jako parametr init

1
Aspid 22 marzec 2020, 11:51