0

我有一个具有获取联系人功能的模型视图:

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 寻求帮助

fetchUPD:由于List 中的方法调用而发生重复.onAppear。所以我正在研究如何只调用一次这个方法,而不是每次出现 View 时。

4

1 回答 1

1

您可以像这样在 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() 中。

但是你不能进去@Environmentinit所以我得到了contextfrom AppDelegate。或者你可以传递contextasinit参数

于 2020-01-11T16:18:26.150 回答