@@ -229,18 +229,18 @@ - (SFRestAPITestResponse *)sendSyncRequest:(SFRestRequest *)request usingInstanc
229229 return result;
230230}
231231
232- // Poll-based SOSL search that retries until records appear or maxWait is exceeded.
233- // SOSL search indexing has a known delay on the server side .
234- - (NSArray *)sendSyncSearchRequestWithRetry : (SFRestRequest *)request expectedMinResults : ( NSUInteger ) minResults maxWaitSeconds : (NSTimeInterval )maxWait {
232+ // Shared polling helper. Sends request repeatedly with exponential backoff until
233+ // the exit condition is satisfied or maxWait is exceeded .
234+ - (NSArray *)pollRequest : (SFRestRequest *)request recordsKey : ( NSString *) key exitCondition : ( BOOL (^)( NSArray *records)) condition maxWaitSeconds : (NSTimeInterval )maxWait {
235235 NSTimeInterval elapsed = 0 ;
236236 NSTimeInterval interval = 2.0 ;
237237 NSArray *records = nil ;
238238
239239 while (elapsed < maxWait) {
240240 SFRestAPITestResponse *response = [self sendSyncRequest: request];
241241 if ([response.returnStatus isEqualToString: kTestRequestStatusDidLoad ]) {
242- records = ((NSDictionary *)response.dataResponse )[SEARCH_RECORDS ];
243- if (records. count >= minResults ) {
242+ records = ((NSDictionary *)response.dataResponse )[key ];
243+ if (condition ( records) ) {
244244 return records;
245245 }
246246 }
@@ -251,68 +251,28 @@ - (NSArray *)sendSyncSearchRequestWithRetry:(SFRestRequest *)request expectedMin
251251 return records;
252252}
253253
254- // Poll-based SOSL search that retries until no results are found (record removed from index).
255- - ( NSArray *) sendSyncSearchRequestUntilEmpty : (SFRestRequest *) request maxWaitSeconds : ( NSTimeInterval ) maxWait {
256- NSTimeInterval elapsed = 0 ;
257- NSTimeInterval interval = 2.0 ;
258- NSArray *records = nil ;
254+ - ( NSArray *) sendSyncSearchRequestWithRetry : (SFRestRequest *) request expectedMinResults : ( NSUInteger ) minResults maxWaitSeconds : ( NSTimeInterval ) maxWait {
255+ return [ self pollRequest: request recordsKey: SEARCH_RECORDS exitCondition: ^ BOOL ( NSArray *records) {
256+ return records. count >= minResults ;
257+ } maxWaitSeconds: maxWait] ;
258+ }
259259
260- while (elapsed < maxWait) {
261- SFRestAPITestResponse *response = [self sendSyncRequest: request];
262- if ([response.returnStatus isEqualToString: kTestRequestStatusDidLoad ]) {
263- records = ((NSDictionary *)response.dataResponse )[SEARCH_RECORDS ];
264- if (records.count == 0 ) {
265- return records;
266- }
267- }
268- [NSThread sleepForTimeInterval: interval];
269- elapsed += interval;
270- interval = MIN (interval * 1.5 , 5.0 );
271- }
272- return records;
260+ - (NSArray *)sendSyncSearchRequestUntilEmpty : (SFRestRequest *)request maxWaitSeconds : (NSTimeInterval )maxWait {
261+ return [self pollRequest: request recordsKey: SEARCH_RECORDS exitCondition: ^BOOL (NSArray *records) {
262+ return records.count == 0 ;
263+ } maxWaitSeconds: maxWait];
273264}
274265
275- // Poll-based SOQL query that retries until zero results are returned (record fully deleted).
276- // SOQL can exhibit brief eventual consistency for deletes on some server configurations.
277266- (NSArray *)sendSyncQueryRequestUntilEmpty : (SFRestRequest *)request maxWaitSeconds : (NSTimeInterval )maxWait {
278- NSTimeInterval elapsed = 0 ;
279- NSTimeInterval interval = 2.0 ;
280- NSArray *records = nil ;
281-
282- while (elapsed < maxWait) {
283- SFRestAPITestResponse *response = [self sendSyncRequest: request];
284- if ([response.returnStatus isEqualToString: kTestRequestStatusDidLoad ]) {
285- records = ((NSDictionary *)response.dataResponse )[RECORDS ];
286- if (records.count == 0 ) {
287- return records;
288- }
289- }
290- [NSThread sleepForTimeInterval: interval];
291- elapsed += interval;
292- interval = MIN (interval * 1.5 , 5.0 );
293- }
294- return records;
267+ return [self pollRequest: request recordsKey: RECORDS exitCondition: ^BOOL (NSArray *records) {
268+ return records.count == 0 ;
269+ } maxWaitSeconds: maxWait];
295270}
296271
297- // Poll SOQL query until at least expectedMinResults records appear (eventual consistency after create).
298272- (NSArray *)sendSyncQueryRequestUntilFound : (SFRestRequest *)request expectedMinResults : (NSUInteger )minResults maxWaitSeconds : (NSTimeInterval )maxWait {
299- NSTimeInterval elapsed = 0 ;
300- NSTimeInterval interval = 2.0 ;
301- NSArray *records = nil ;
302-
303- while (elapsed < maxWait) {
304- SFRestAPITestResponse *response = [self sendSyncRequest: request];
305- if ([response.returnStatus isEqualToString: kTestRequestStatusDidLoad ]) {
306- records = ((NSDictionary *)response.dataResponse )[RECORDS ];
307- if (records.count >= minResults) {
308- return records;
309- }
310- }
311- [NSThread sleepForTimeInterval: interval];
312- elapsed += interval;
313- interval = MIN (interval * 1.5 , 5.0 );
314- }
315- return records;
273+ return [self pollRequest: request recordsKey: RECORDS exitCondition: ^BOOL (NSArray *records) {
274+ return records.count >= minResults;
275+ } maxWaitSeconds: maxWait];
316276}
317277
318278// Retry owned-files list until a specific file ID appears.
0 commit comments