mirror of https://github.com/oxen-io/session-ios
				
				
				
			
			You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
	
	
		
			89 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			C
		
	
		
		
			
		
	
	
			89 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			C
		
	
| 
											5 years ago
										 | //
 | ||
|  | //  Copyright (c) 2018 Open Whisper Systems. All rights reserved.
 | ||
|  | //
 | ||
|  | 
 | ||
|  | #import <Foundation/Foundation.h>
 | ||
|  | 
 | ||
|  | NS_ASSUME_NONNULL_BEGIN | ||
|  | 
 | ||
|  | typedef NS_ENUM(NSInteger, OWSOperationState) { | ||
|  |     OWSOperationStateNew, | ||
|  |     OWSOperationStateExecuting, | ||
|  |     OWSOperationStateFinished | ||
|  | }; | ||
|  | 
 | ||
|  | // A base class for implementing retryable operations.
 | ||
|  | // To utilize the retryable behavior:
 | ||
|  | // Set remainingRetries to something greater than 0, and when you're reporting an error,
 | ||
|  | // set `error.isRetryable = YES`.
 | ||
|  | // If the failure is one that will not succeed upon retry, set `error.isFatal = YES`.
 | ||
|  | //
 | ||
|  | // isRetryable and isFatal are opposites but not redundant.
 | ||
|  | //
 | ||
|  | // If a group message send fails, the send will be retried if any of the errors were retryable UNLESS
 | ||
|  | // any of the errors were fatal. Fatal errors trump retryable errors.
 | ||
|  | @interface OWSOperation : NSOperation | ||
|  | 
 | ||
|  | @property (readonly, nullable) NSError *failingError; | ||
|  | 
 | ||
|  | // Defaults to 0, set to greater than 0 in init if you'd like the operation to be retryable.
 | ||
|  | @property NSUInteger remainingRetries; | ||
|  | 
 | ||
|  | #pragma mark - Mandatory Subclass Overrides
 | ||
|  | 
 | ||
|  | // Called every retry, this is where the bulk of the operation's work should go.
 | ||
|  | - (void)run; | ||
|  | 
 | ||
|  | #pragma mark - Optional Subclass Overrides
 | ||
|  | 
 | ||
|  | // Called one time only
 | ||
|  | - (nullable NSError *)checkForPreconditionError; | ||
|  | 
 | ||
|  | // Called at most one time.
 | ||
|  | - (void)didSucceed; | ||
|  | 
 | ||
|  | // Called at most one time.
 | ||
|  | - (void)didCancel; | ||
|  | 
 | ||
|  | // Called zero or more times, retry may be possible
 | ||
|  | - (void)didReportError:(NSError *)error; | ||
|  | 
 | ||
|  | // Called at most one time, once retry is no longer possible.
 | ||
|  | - (void)didFailWithError:(NSError *)error NS_SWIFT_NAME(didFail(error:)); | ||
|  | 
 | ||
|  | // How long to wait before retry, if possible
 | ||
|  | - (NSTimeInterval)retryInterval; | ||
|  | 
 | ||
|  | #pragma mark - Success/Error - Do Not Override
 | ||
|  | 
 | ||
|  | // Runs now if a retry timer has been set by a previous failure,
 | ||
|  | // otherwise assumes we're currently running and does nothing.
 | ||
|  | - (void)runAnyQueuedRetry; | ||
|  | 
 | ||
|  | // Report that the operation completed successfully.
 | ||
|  | //
 | ||
|  | // Each invocation of `run` must make exactly one call to one of: `reportSuccess`, `reportCancelled`, or `reportError:`
 | ||
|  | - (void)reportSuccess; | ||
|  | 
 | ||
|  | // Call this when you abort before completion due to being cancelled.
 | ||
|  | //
 | ||
|  | // Each invocation of `run` must make exactly one call to one of: `reportSuccess`, `reportCancelled`, or `reportError:`
 | ||
|  | - (void)reportCancelled; | ||
|  | 
 | ||
|  | // Report that the operation failed to complete due to an error.
 | ||
|  | //
 | ||
|  | // Each invocation of `run` must make exactly one call to one of: `reportSuccess`, `reportCancelled`, or `reportError:`
 | ||
|  | // You must ensure that `run` cannot succeed after calling `reportError`, e.g. generally you'll write something like
 | ||
|  | // this:
 | ||
|  | //
 | ||
|  | //     [self reportError:someError];
 | ||
|  | //     return;
 | ||
|  | //
 | ||
|  | // If the error is terminal, and you want to avoid retry, report an error with `error.isFatal = YES` otherwise the
 | ||
|  | // operation will retry if possible.
 | ||
|  | - (void)reportError:(NSError *)error; | ||
|  | 
 | ||
|  | @end | ||
|  | 
 | ||
|  | NS_ASSUME_NONNULL_END |