Reputation: 6600
SwiftUI tables require a binding to an array storing the entirety of your model objects in memory. For small datasets, the tradeoff of convenience for performance makes sense. But for datasets with tens/hundreds of thousands of values, the old-school approach to rendering tables through queries to a datasource still seems like the way to go. (Consider a simple dictionary/thesaurus app.).
Is there a way to implement dataSource-style/CoreData-backed tables within SwiftUI?
Upvotes: 9
Views: 2833
Reputation: 10174
I think that's the reason of using ForEach() for loops in SwiftUI, so the view can control how many elements needs to instantiate to fill the screen.
And the Array from a Core Data fetch request probably doesn't contains all the objects in memory, they only get instantiated when they are accessed.
Upvotes: 0
Reputation: 2958
List does not require an Array
. The Data
must conform to the RandomAccessCollection
protocol.
This could also be your NSFetchedResultsController
.
extension List {
/// Creates a List that computes its rows on demand from an underlying
/// collection of identified data.
@available(watchOS, unavailable)
public init<Data, RowContent>(
_: Data,
selection _: Binding<Selection>?,
rowContent _: @escaping (Data.Element.IdentifiedValue) -> RowContent
) where Content == ForEach<Data, HStack<RowContent>>,
Data: RandomAccessCollection,
RowContent: View,
Data.Element:
Identifiable
/// Creates a List that computes its rows on demand from an underlying
/// collection of identified data.
@available(watchOS, unavailable)
public init<Data, RowContent>(
_: Data,
selection _: Binding<Selection>?,
action _: @escaping (Data.Element.IdentifiedValue) -> Void,
rowContent _: @escaping (Data.Element.IdentifiedValue) -> RowContent
) where Content == ForEach<Data, Button<HStack<RowContent>>>,
Data: RandomAccessCollection,
RowContent: View, Dat
}
Upvotes: 6