diff --git a/Source/ARTPaginatedResult.m b/Source/ARTPaginatedResult.m index 39b37bacc..5e175c4e1 100644 --- a/Source/ARTPaginatedResult.m +++ b/Source/ARTPaginatedResult.m @@ -9,14 +9,17 @@ #import "ARTInternalLog.h" @implementation ARTPaginatedResult { - ARTRestInternal *_rest; - dispatch_queue_t _userQueue; - dispatch_queue_t _queue; - NSMutableURLRequest *_relFirst; - NSMutableURLRequest *_relCurrent; - NSMutableURLRequest *_relNext; - ARTPaginatedResultResponseProcessor _responseProcessor; - ARTQueuedDealloc *_dealloc; + BOOL _initializedViaInit; + + // All of the below instance variables are non-nil if and only if _initializedViaInit is NO + ARTRestInternal *_Nullable _rest; + _Nullable dispatch_queue_t _userQueue; + _Nullable dispatch_queue_t _queue; + NSMutableURLRequest *_Nullable _relFirst; + NSMutableURLRequest *_Nullable _relCurrent; + NSMutableURLRequest *_Nullable _relNext; + _Nullable ARTPaginatedResultResponseProcessor _responseProcessor; + ARTQueuedDealloc *_Nullable _dealloc; } @synthesize rest = _rest; @@ -25,6 +28,17 @@ @implementation ARTPaginatedResult { @synthesize relFirst = _relFirst; @synthesize relCurrent = _relCurrent; @synthesize relNext = _relNext; +@synthesize hasNext = _hasNext; +@synthesize isLast = _isLast; +@synthesize items = _items; + +- (instancetype)init { + if (self = [super init]) { + _initializedViaInit = YES; + } + + return self; +} - (instancetype)initWithItems:(NSArray *)items rest:(ARTRestInternal *)rest @@ -34,6 +48,8 @@ - (instancetype)initWithItems:(NSArray *)items responseProcessor:(ARTPaginatedResultResponseProcessor)responseProcessor logger:(ARTInternalLog *)logger { if (self = [super init]) { + _initializedViaInit = NO; + _items = items; _relFirst = relFirst; @@ -67,7 +83,37 @@ - (instancetype)initWithItems:(NSArray *)items return self; } + + +- (BOOL)hasNext { + if (_initializedViaInit) { + [NSException raise:NSInvalidArgumentException format:@"When initializing this class using -init, you need to override this method in a subclass"]; + } + + return _hasNext; +} + +- (BOOL)isLast { + if (_initializedViaInit) { + [NSException raise:NSInvalidArgumentException format:@"When initializing this class using -init, you need to override this method in a subclass"]; + } + + return _isLast; +} + +- (NSArray *)items { + if (_initializedViaInit) { + [NSException raise:NSInvalidArgumentException format:@"When initializing this class using -init, you need to override this method in a subclass"]; + } + + return _items; +} + - (void)first:(void (^)(ARTPaginatedResult *_Nullable result, ARTErrorInfo *_Nullable error))callback { + if (_initializedViaInit) { + [NSException raise:NSInvalidArgumentException format:@"When initializing this class using -init, you need to override this method in a subclass"]; + } + if (callback) { void (^userCallback)(ARTPaginatedResult *_Nullable result, ARTErrorInfo *_Nullable error) = callback; callback = ^(ARTPaginatedResult *_Nullable result, ARTErrorInfo *_Nullable error) { @@ -81,6 +127,10 @@ - (void)first:(void (^)(ARTPaginatedResult *_Nullable result, ARTErrorInfo * } - (void)next:(void (^)(ARTPaginatedResult *_Nullable result, ARTErrorInfo *_Nullable error))callback { + if (_initializedViaInit) { + [NSException raise:NSInvalidArgumentException format:@"When initializing this class using -init, you need to override this method in a subclass"]; + } + if (callback) { void (^userCallback)(ARTPaginatedResult *_Nullable result, ARTErrorInfo *_Nullable error) = callback; callback = ^(ARTPaginatedResult *_Nullable result, ARTErrorInfo *_Nullable error) { diff --git a/Source/include/Ably/ARTPaginatedResult.h b/Source/include/Ably/ARTPaginatedResult.h index a5b73561f..467af9382 100644 --- a/Source/include/Ably/ARTPaginatedResult.h +++ b/Source/include/Ably/ARTPaginatedResult.h @@ -27,7 +27,8 @@ NS_SWIFT_SENDABLE @property (nonatomic, readonly) BOOL isLast; /// :nodoc: -- (instancetype)init UNAVAILABLE_ATTRIBUTE; +/// If you use this initializer, trying to call any of the methods or properties in ARTPaginatedResult will throw an exception; you must provide your own implementation in a subclass. This initializer exists purely to allow you to provide a mock implementation of this class in your tests. +- (instancetype)init; /** * Returns a new `ARTPaginatedResult` for the first page of results.