SwiftUI Извлечение дублирования контактов - PullRequest
0 голосов
/ 11 января 2020

У меня есть вид модели, который имеет функцию извлечения контактов:

class ContactsStore: ObservableObject {

@Published var contacts = [CNContact]()

func fetch() {} ...

А затем в моем представлении:

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

Я сократил свой код для удобства, добавлю / редактировать при необходимости. Проблема, с которой я столкнулся - каждый раз, когда мое представление отображается, вызывается функция fetch, и мой массив дублируется в моем представлении. TIA для справки

UPD: Дублирование происходит из-за вызова метода fetch в Списке .onAppear. Поэтому я смотрю, как вызывать этот метод только один раз, а не каждый раз, когда появляется представление.

1 Ответ

1 голос
/ 11 января 2020

Вы можете сделать выборку в Init () следующим образом:

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

Не пробовал с группировкой, но вы спросили, как получить только один раз. Ответ - в init ().

Но вы не можете получить @Environment в init, поэтому я получаю context от AppDelegate. Или вы можете передать context как init параметр

...