@@ -25,10 +25,12 @@ extension FeatureFormView {
2525 @State private var candidates : [ UtilityAssociationFeatureCandidate ] = [ ]
2626 /// The phrase used to filter candidates by name.
2727 @State private var filterPhrase = " "
28- /// A Boolean value indicating if the initial candidate query is complete.
29- @State private var initialQueryIsComplete = false
3028 /// The parameters for retrieving the next page of results.
3129 @State private var nextQueryParameters : QueryParameters ?
30+ /// A Boolean value indicating whether a filter based query is running.
31+ @State private var queryForFilterPhraseIsRunning = false
32+ /// A Boolean value indicating if the initial candidate query is complete.
33+ @State private var queryForFirstPageIsComplete = false
3234 /// A Boolean value indicating whether a query is running.
3335 @State private var queryIsRunning = false
3436 /// The task for the current query.
@@ -48,23 +50,28 @@ extension FeatureFormView {
4850 var body : some View {
4951 List {
5052 sectionForFilter
51- if !initialQueryIsComplete {
53+ if !queryForFirstPageIsComplete {
5254 ProgressView ( )
55+ . task {
56+ let parameters = QueryParameters ( )
57+ parameters. whereClause = " 1=1 "
58+ queryFeatures ( parameters: parameters)
59+ await queryTask? . value
60+ queryForFirstPageIsComplete = true
61+ }
5362 } else {
54- if filteredCandidates. isEmpty && !queryIsRunning {
55- contentUnavailableView
63+ if filteredCandidates. isEmpty {
64+ if queryForFilterPhraseIsRunning {
65+ ProgressView ( )
66+ . id ( filterPhrase)
67+ } else if !queryIsRunning {
68+ contentUnavailableView
69+ }
5670 } else {
5771 sectionForCandidates
5872 }
5973 }
6074 }
61- . task {
62- let parameters = QueryParameters ( )
63- parameters. whereClause = " 1=1 "
64- queryFeatures ( parameters: parameters)
65- await queryTask? . value
66- initialQueryIsComplete = true
67- }
6875 }
6976
7077 /// A view to indicate no utility association candidate results were found.
@@ -127,10 +134,6 @@ extension FeatureFormView {
127134 . task {
128135 queryFeatures ( parameters: nextQueryParameters)
129136 }
130- } else if queryIsRunning {
131- // Paging via filter phrase
132- ProgressView ( )
133- . id ( nextQueryParameters. resultOffset)
134137 }
135138 }
136139 } header: {
@@ -169,23 +172,27 @@ extension FeatureFormView {
169172 """
170173 )
171174 )
175+ . disabled ( !queryForFirstPageIsComplete)
172176 . task ( id: filterPhrase) {
173- while filteredCandidates. isEmpty, let nextQueryParameters {
177+ try ? await Task . sleep ( for: . milliseconds( 500 ) )
178+ queryForFilterPhraseIsRunning = true
179+ while !Task. isCancelled, filteredCandidates. isEmpty, let nextQueryParameters {
174180 queryFeatures ( parameters: nextQueryParameters)
175181 await queryTask? . value
176182 }
183+ queryForFilterPhraseIsRunning = false
177184 }
178185 }
179186 }
180187
181188 func queryFeatures( parameters: QueryParameters ) {
182189 queryTask? . cancel ( )
190+ queryIsRunning = true
183191 queryTask = Task {
184- queryIsRunning = true
185192 let result = try ? await source. queryFeatures ( assetType: assetType, parameters: parameters)
186- queryIsRunning = false
187193 candidates. append ( contentsOf: result? . candidates ?? [ ] )
188194 nextQueryParameters = result? . nextQueryParams
195+ queryIsRunning = false
189196 }
190197 }
191198 }
0 commit comments