Skip to content

Commit a8ba8e2

Browse files
Extract shared polling helper for SOSL/SOQL retry methods
Per reviewer feedback (bbirman): the four polling helpers shared identical loop structure. Extracted pollRequest:recordsKey:exitCondition: maxWaitSeconds: as the shared primitive. Each caller now passes its specific records key and exit condition block. The two waitForOwnedFilesList: methods remain separate — different return type and file-ID matching logic don't fit the same shape.
1 parent df311bc commit a8ba8e2

1 file changed

Lines changed: 20 additions & 60 deletions

File tree

libs/SalesforceSDKCore/SalesforceSDKCoreTests/SalesforceRestAPITests.m

Lines changed: 20 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)