diff --git a/EDQueue/EDQueue.h b/EDQueue/EDQueue.h index 3f8ca8d..da14d2a 100755 --- a/EDQueue/EDQueue.h +++ b/EDQueue/EDQueue.h @@ -8,48 +8,44 @@ #import -// - -typedef enum { - EDQueueResultSuccess, +typedef NS_ENUM(NSInteger, EDQueueResult) { + EDQueueResultSuccess = 0, EDQueueResultFail, EDQueueResultCritical -} EDQueueResult; +}; -UIKIT_EXTERN NSString *const EDQueueDidStart; -UIKIT_EXTERN NSString *const EDQueueDidStop; -UIKIT_EXTERN NSString *const EDQueueJobDidSucceed; -UIKIT_EXTERN NSString *const EDQueueJobDidFail; -UIKIT_EXTERN NSString *const EDQueueDidDrain; +typedef void (^EDQueueCompletionBlock)(EDQueueResult result); -// +extern NSString *const EDQueueDidStart; +extern NSString *const EDQueueDidStop; +extern NSString *const EDQueueJobDidSucceed; +extern NSString *const EDQueueJobDidFail; +extern NSString *const EDQueueDidDrain; -@class EDQueue; - -@protocol EDQueueDelegate -@optional -- (EDQueueResult)queue:(EDQueue *)queue processJob:(NSDictionary *)job; -- (void)queue:(EDQueue *)queue processJob:(NSDictionary *)job completion:(void (^)(EDQueueResult result))block; -@end +@protocol EDQueueDelegate; +@interface EDQueue : NSObject -// ++ (EDQueue *)sharedInstance; -@interface EDQueue : NSObject +@property (nonatomic, weak) id delegate; -@property (weak) id delegate; -@property (readonly) Boolean isRunning; -@property (readonly) Boolean isActive; -@property NSUInteger retryLimit; +@property (nonatomic, readonly) BOOL isRunning; +@property (nonatomic, readonly) BOOL isActive; +@property (nonatomic) NSUInteger retryLimit; -+ (EDQueue *)sharedInstance; - (void)enqueueWithData:(id)data forTask:(NSString *)task; - - (void)start; - (void)stop; - (void)empty; -- (Boolean)jobExistsForTask:(NSString *)task; -- (Boolean)jobIsActiveForTask:(NSString *)task; +- (BOOL)jobExistsForTask:(NSString *)task; +- (BOOL)jobIsActiveForTask:(NSString *)task; - (NSDictionary *)nextJobForTask:(NSString *)task; -@end \ No newline at end of file +@end + +@protocol EDQueueDelegate +@optional +- (EDQueueResult)queue:(EDQueue *)queue processJob:(NSDictionary *)job; +- (void)queue:(EDQueue *)queue processJob:(NSDictionary *)job completion:(EDQueueCompletionBlock)block; +@end diff --git a/EDQueue/EDQueue.m b/EDQueue/EDQueue.m index 9797bb5..8658c1a 100755 --- a/EDQueue/EDQueue.m +++ b/EDQueue/EDQueue.m @@ -9,16 +9,6 @@ #import "EDQueue.h" #import "EDQueueStorageEngine.h" -// - -#define DEFINE_SHARED_INSTANCE_USING_BLOCK(block) \ -static dispatch_once_t pred = 0; \ -__strong static id _sharedObject = nil; \ -dispatch_once(&pred, ^{ \ -_sharedObject = block(); \ -}); \ -return _sharedObject; \ - NSString *const EDQueueDidStart = @"EDQueueDidStart"; NSString *const EDQueueDidStop = @"EDQueueDidStop"; NSString *const EDQueueJobDidSucceed = @"EDQueueJobDidSucceed"; @@ -26,37 +16,55 @@ NSString *const EDQueueDidDrain = @"EDQueueDidDrain"; @interface EDQueue () -@property EDQueueStorageEngine *engine; -@property (readwrite) Boolean isRunning; -@property (readwrite) Boolean isActive; -@property (readwrite) NSString *activeTask; +{ + BOOL _isRunning; + BOOL _isActive; + NSUInteger _retryLimit; +} + +@property (nonatomic) EDQueueStorageEngine *engine; +@property (nonatomic, readwrite) NSString *activeTask; + @end // @implementation EDQueue -#pragma mark - Init +@synthesize isRunning = _isRunning; +@synthesize isActive = _isActive; +@synthesize retryLimit = _retryLimit; + +#pragma mark - Singleton + (EDQueue *)sharedInstance { - DEFINE_SHARED_INSTANCE_USING_BLOCK(^{ - return [[self alloc] init]; + static EDQueue *singleton = nil; + static dispatch_once_t once = 0; + dispatch_once(&once, ^{ + singleton = [[self alloc] init]; }); + return singleton; } +#pragma mark - Init + - (id)init { self = [super init]; if (self) { _engine = [[EDQueueStorageEngine alloc] init]; - _isRunning = false; - _isActive = false; _retryLimit = 4; } return self; } +- (void)dealloc +{ + self.delegate = nil; + _engine = nil; +} + #pragma mark - Public methods /** @@ -81,9 +89,9 @@ - (void)enqueueWithData:(id)data forTask:(NSString *)task * * @return {Boolean} */ -- (Boolean)jobExistsForTask:(NSString *)task +- (BOOL)jobExistsForTask:(NSString *)task { - Boolean jobExists = [self.engine jobExistsForTask:task]; + BOOL jobExists = [self.engine jobExistsForTask:task]; return jobExists; } @@ -94,9 +102,9 @@ - (Boolean)jobExistsForTask:(NSString *)task * * @return {Boolean} */ -- (Boolean)jobIsActiveForTask:(NSString *)task +- (BOOL)jobIsActiveForTask:(NSString *)task { - Boolean jobIsActive = [self.activeTask length] > 0 && [self.activeTask isEqualToString:task]; + BOOL jobIsActive = [self.activeTask length] > 0 && [self.activeTask isEqualToString:task]; return jobIsActive; } @@ -121,7 +129,7 @@ - (NSDictionary *)nextJobForTask:(NSString *)task - (void)start { if (!self.isRunning) { - self.isRunning = true; + _isRunning = YES; [self tick]; [self performSelectorOnMainThread:@selector(postNotification:) withObject:[NSDictionary dictionaryWithObjectsAndKeys:EDQueueDidStart, @"name", nil, @"data", nil] waitUntilDone:false]; } @@ -136,7 +144,7 @@ - (void)start - (void)stop { if (self.isRunning) { - self.isRunning = false; + _isRunning = YES; [self performSelectorOnMainThread:@selector(postNotification:) withObject:[NSDictionary dictionaryWithObjectsAndKeys:EDQueueDidStop, @"name", nil, @"data", nil] waitUntilDone:false]; } } @@ -168,7 +176,7 @@ - (void)tick dispatch_async(gcd, ^{ if (self.isRunning && !self.isActive && [self.engine fetchJobCount] > 0) { // Start job - self.isActive = true; + _isActive = YES; id job = [self.engine fetchJob]; self.activeTask = [(NSDictionary *)job objectForKey:@"task"]; @@ -212,7 +220,7 @@ - (void)processJob:(NSDictionary*)job withResult:(EDQueueResult)result } // Clean-up - self.isActive = false; + _isActive = NO; // Drain if ([self.engine fetchJobCount] == 0) { @@ -248,12 +256,4 @@ - (void)errorWithMessage:(NSString *)message NSLog(@"EDQueue Error: %@", message); } -#pragma mark - Dealloc - -- (void)dealloc -{ - self.delegate = nil; - _engine = nil; -} - @end diff --git a/EDQueue/EDQueueStorageEngine.h b/EDQueue/EDQueueStorageEngine.h index d0b33c2..aec98f4 100755 --- a/EDQueue/EDQueueStorageEngine.h +++ b/EDQueue/EDQueueStorageEngine.h @@ -8,17 +8,13 @@ #import -#import "FMDatabase.h" -#import "FMDatabaseAdditions.h" -#import "FMDatabasePool.h" -#import "FMDatabaseQueue.h" - +@class FMDatabaseQueue; @interface EDQueueStorageEngine : NSObject @property (retain) FMDatabaseQueue *queue; - (void)createJob:(id)data forTask:(id)task; -- (Boolean)jobExistsForTask:(id)task; +- (BOOL)jobExistsForTask:(id)task; - (void)incrementAttemptForJob:(NSNumber *)jid; - (void)removeJob:(NSNumber *)jid; - (void)removeAllJobs; diff --git a/EDQueue/EDQueueStorageEngine.m b/EDQueue/EDQueueStorageEngine.m index a2dc3e1..9d2e907 100755 --- a/EDQueue/EDQueueStorageEngine.m +++ b/EDQueue/EDQueueStorageEngine.m @@ -8,6 +8,11 @@ #import "EDQueueStorageEngine.h" +#import "FMDatabase.h" +#import "FMDatabaseAdditions.h" +#import "FMDatabasePool.h" +#import "FMDatabaseQueue.h" + @implementation EDQueueStorageEngine #pragma mark - Init @@ -25,15 +30,18 @@ - (id)init _queue = [[FMDatabaseQueue alloc] initWithPath:path]; [self.queue inDatabase:^(FMDatabase *db) { [db executeUpdate:@"CREATE TABLE IF NOT EXISTS queue (id INTEGER PRIMARY KEY, task TEXT NOT NULL, data TEXT NOT NULL, attempts INTEGER DEFAULT 0, stamp STRING DEFAULT (strftime('%s','now')) NOT NULL, udef_1 TEXT, udef_2 TEXT)"]; - [self databaseHadError:[db hadError] fromDatabase:db]; + [self _databaseHadError:[db hadError] fromDatabase:db]; }]; } - - return self; } +- (void)dealloc +{ + _queue = nil; +} + #pragma mark - Public methods /** @@ -45,13 +53,12 @@ - (id)init * @return {void} */ - (void)createJob:(id)data forTask:(id)task - { NSString *dataString = [[NSString alloc] initWithData:[NSJSONSerialization dataWithJSONObject:data options:NSJSONWritingPrettyPrinted error:nil] encoding:NSUTF8StringEncoding]; [self.queue inDatabase:^(FMDatabase *db) { [db executeUpdate:@"INSERT INTO queue (task, data) VALUES (?, ?)", task, dataString]; - [self databaseHadError:[db hadError] fromDatabase:db]; + [self _databaseHadError:[db hadError] fromDatabase:db]; }]; } @@ -62,13 +69,13 @@ - (void)createJob:(id)data forTask:(id)task * * @return {BOOL} */ -- (Boolean)jobExistsForTask:(id)task +- (BOOL)jobExistsForTask:(id)task { - __block Boolean jobExists = NO; + __block BOOL jobExists = NO; [self.queue inDatabase:^(FMDatabase *db) { FMResultSet *rs = [db executeQuery:@"SELECT count(id) AS count FROM queue WHERE task = ?", task]; - [self databaseHadError:[db hadError] fromDatabase:db]; + [self _databaseHadError:[db hadError] fromDatabase:db]; while ([rs next]) { jobExists |= ([rs intForColumn:@"count"] > 0); @@ -91,7 +98,7 @@ - (void)incrementAttemptForJob:(NSNumber *)jid { [self.queue inDatabase:^(FMDatabase *db) { [db executeUpdate:@"UPDATE queue SET attempts = attempts + 1 WHERE id = ?", jid]; - [self databaseHadError:[db hadError] fromDatabase:db]; + [self _databaseHadError:[db hadError] fromDatabase:db]; }]; } @@ -106,11 +113,10 @@ - (void)removeJob:(NSNumber *)jid { [self.queue inDatabase:^(FMDatabase *db) { [db executeUpdate:@"DELETE FROM queue WHERE id = ?", jid]; - [self databaseHadError:[db hadError] fromDatabase:db]; + [self _databaseHadError:[db hadError] fromDatabase:db]; }]; } - /** * Removes all pending jobs from the datastore * @@ -120,7 +126,7 @@ - (void)removeJob:(NSNumber *)jid - (void)removeAllJobs { [self.queue inDatabase:^(FMDatabase *db) { [db executeUpdate:@"DELETE FROM queue"]; - [self databaseHadError:[db hadError] fromDatabase:db]; + [self _databaseHadError:[db hadError] fromDatabase:db]; }]; } @@ -135,7 +141,7 @@ - (NSUInteger)fetchJobCount [self.queue inDatabase:^(FMDatabase *db) { FMResultSet *rs = [db executeQuery:@"SELECT count(id) AS count FROM queue"]; - [self databaseHadError:[db hadError] fromDatabase:db]; + [self _databaseHadError:[db hadError] fromDatabase:db]; while ([rs next]) { count = [rs intForColumn:@"count"]; @@ -158,10 +164,10 @@ - (NSDictionary *)fetchJob [self.queue inDatabase:^(FMDatabase *db) { FMResultSet *rs = [db executeQuery:@"SELECT * FROM queue ORDER BY id ASC LIMIT 1"]; - [self databaseHadError:[db hadError] fromDatabase:db]; + [self _databaseHadError:[db hadError] fromDatabase:db]; while ([rs next]) { - job = [self jobFromResultSet:rs]; + job = [self _jobFromResultSet:rs]; } [rs close]; @@ -183,10 +189,10 @@ - (NSDictionary *)fetchJobForTask:(id)task [self.queue inDatabase:^(FMDatabase *db) { FMResultSet *rs = [db executeQuery:@"SELECT * FROM queue WHERE task = ? ORDER BY id ASC LIMIT 1", task]; - [self databaseHadError:[db hadError] fromDatabase:db]; + [self _databaseHadError:[db hadError] fromDatabase:db]; while ([rs next]) { - job = [self jobFromResultSet:rs]; + job = [self _jobFromResultSet:rs]; } [rs close]; @@ -197,7 +203,7 @@ - (NSDictionary *)fetchJobForTask:(id)task #pragma mark - Private methods -- (NSDictionary *)jobFromResultSet:(FMResultSet *)rs +- (NSDictionary *)_jobFromResultSet:(FMResultSet *)rs { NSDictionary *job = @{ @"id": [NSNumber numberWithInt:[rs intForColumn:@"id"]], @@ -209,17 +215,10 @@ - (NSDictionary *)jobFromResultSet:(FMResultSet *)rs return job; } -- (Boolean)databaseHadError:(Boolean)flag fromDatabase:(FMDatabase *)db +- (BOOL)_databaseHadError:(BOOL)flag fromDatabase:(FMDatabase *)db { if (flag) NSLog(@"Queue Database Error %d: %@", [db lastErrorCode], [db lastErrorMessage]); return flag; } -#pragma mark - Dealloc - -- (void)dealloc -{ - _queue = nil; -} - @end