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
		
	
	
	
		
			Objective-C
		
	
			
		
		
	
	
			89 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Objective-C
		
	
| //
 | |
| //  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
 |