ccd
ccd

Reputation: 6908

How to judge the predicate coreData object is or is not empty

I want to judge the coreData object with predicate filter is or is not empty, so I can get this object from web server or locally.

struct MyView: View {
    @AppStorage("filter") private var filter = ""
    @Environment(\.managedObjectContext) var moc
    @State private var valueFilter = ""
    
    var body: some View {
        FilterValueView(filter: valueFilter)
            .onAppear(perform: fetchValues)
    }

    func fetchValues() {
        // Set the value filter by valueFilter
        self.valueFilter = self.filter
        // Check if the values is fetched from web server
        // If empty fetch from web server, if not fetch locally.
        // How to do it?
    }
}

struct FilterValueView: View {
    var fetchRequest: FetchRequest<Value>
    var values: FetchedResults<Value> { fetchRequest.wrappedValue }
    
    var body: some View {
        List(values, id: \.self) { value in
            ...
        }
    }
    
    init(filter: String) {
        fetchRequest = FetchRequest<Value>(entity: Value(), sortDescriptors: [], predicate: NSPredicate(format: "value filter is %@", filter))
    }
}

Upvotes: 1

Views: 77

Answers (1)

Asperi
Asperi

Reputation: 257663

It is rather will be in FilterValueView, because results of fetched data will be in it, so

struct FilterValueView: View {
    var fetchRequest: FetchRequest<Value>
    var values: FetchedResults<Value> { fetchRequest.wrappedValue }
    
    var body: some View {
        if values.isEmpty {      // << here !!
           Text("Loading...")
             .onAppear {
                // no data in local storage ...
                // ... call fetch from web             // << here !!
             }
        } else {
           List(values, id: \.self) { value in
              ...
          }
        }
    }
    
    init(filter: String) {
        fetchRequest = FetchRequest<Value>(entity: Value(), sortDescriptors: [], predicate: NSPredicate(format: "value filter is %@", filter))
    }
}

Upvotes: 1

Related Questions