From 5e4124bfc0fe2143a434f85556e7630548c0b6db Mon Sep 17 00:00:00 2001 From: Patrick Piemonte Date: Tue, 28 Jan 2014 10:19:11 -0800 Subject: [PATCH 01/12] EDQueue, update enum definition --- EDQueue/EDQueue.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/EDQueue/EDQueue.h b/EDQueue/EDQueue.h index 3f8ca8d..a6c494f 100755 --- a/EDQueue/EDQueue.h +++ b/EDQueue/EDQueue.h @@ -10,11 +10,11 @@ // -typedef enum { - EDQueueResultSuccess, +typedef NS_ENUM(NSInteger, EDQueueResult) { + EDQueueResultSuccess = 0, EDQueueResultFail, EDQueueResultCritical -} EDQueueResult; +}; UIKIT_EXTERN NSString *const EDQueueDidStart; UIKIT_EXTERN NSString *const EDQueueDidStop; From 283bd9d9a797c84653c24d19dcb218d3df9818bc Mon Sep 17 00:00:00 2001 From: Patrick Piemonte Date: Tue, 28 Jan 2014 10:19:29 -0800 Subject: [PATCH 02/12] EDQueue, remove UIKit type (Foundation only class) --- EDQueue/EDQueue.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/EDQueue/EDQueue.h b/EDQueue/EDQueue.h index a6c494f..3f14915 100755 --- a/EDQueue/EDQueue.h +++ b/EDQueue/EDQueue.h @@ -16,11 +16,11 @@ typedef NS_ENUM(NSInteger, EDQueueResult) { EDQueueResultCritical }; -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; +extern NSString *const EDQueueDidStart; +extern NSString *const EDQueueDidStop; +extern NSString *const EDQueueJobDidSucceed; +extern NSString *const EDQueueJobDidFail; +extern NSString *const EDQueueDidDrain; // From 1c5f405bd5536db6ed8466048e0a578c767b21d5 Mon Sep 17 00:00:00 2001 From: Patrick Piemonte Date: Tue, 28 Jan 2014 10:20:23 -0800 Subject: [PATCH 03/12] EDQueue, move delegate definition to bottom --- EDQueue/EDQueue.h | 21 ++++++++------------- 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/EDQueue/EDQueue.h b/EDQueue/EDQueue.h index 3f14915..2be5eb1 100755 --- a/EDQueue/EDQueue.h +++ b/EDQueue/EDQueue.h @@ -22,18 +22,7 @@ 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 @property (weak) id delegate; @@ -52,4 +41,10 @@ extern NSString *const EDQueueDidDrain; - (Boolean)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:(void (^)(EDQueueResult result))block; +@end From 0356b081e6307ae3700e2963de7791fb4c7f94f8 Mon Sep 17 00:00:00 2001 From: Patrick Piemonte Date: Tue, 28 Jan 2014 10:27:15 -0800 Subject: [PATCH 04/12] EDQueue, add a completion block type for convenience --- EDQueue/EDQueue.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/EDQueue/EDQueue.h b/EDQueue/EDQueue.h index 2be5eb1..e92db86 100755 --- a/EDQueue/EDQueue.h +++ b/EDQueue/EDQueue.h @@ -16,6 +16,8 @@ typedef NS_ENUM(NSInteger, EDQueueResult) { EDQueueResultCritical }; +typedef void (^EDQueueCompletionBlock)(EDQueueResult result); + extern NSString *const EDQueueDidStart; extern NSString *const EDQueueDidStop; extern NSString *const EDQueueJobDidSucceed; @@ -46,5 +48,5 @@ extern NSString *const EDQueueDidDrain; @protocol EDQueueDelegate @optional - (EDQueueResult)queue:(EDQueue *)queue processJob:(NSDictionary *)job; -- (void)queue:(EDQueue *)queue processJob:(NSDictionary *)job completion:(void (^)(EDQueueResult result))block; +- (void)queue:(EDQueue *)queue processJob:(NSDictionary *)job completion:(EDQueueCompletionBlock)block; @end From ada55b2887ddee5635967f20f3dd09ed5b16f0a0 Mon Sep 17 00:00:00 2001 From: Patrick Piemonte Date: Tue, 28 Jan 2014 10:27:39 -0800 Subject: [PATCH 05/12] EDQueue, remove macro --- EDQueue/EDQueue.m | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/EDQueue/EDQueue.m b/EDQueue/EDQueue.m index 9797bb5..ce5f2ad 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,6 +16,9 @@ NSString *const EDQueueDidDrain = @"EDQueueDidDrain"; @interface EDQueue () +{ +} + @property EDQueueStorageEngine *engine; @property (readwrite) Boolean isRunning; @property (readwrite) Boolean isActive; @@ -36,15 +29,20 @@ @interface EDQueue () @implementation EDQueue -#pragma mark - Init +#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]; From 1a49b126e22f04b82f0fd8f252d715e5371cb4da Mon Sep 17 00:00:00 2001 From: Patrick Piemonte Date: Tue, 28 Jan 2014 10:34:57 -0800 Subject: [PATCH 06/12] EDQueue, explicitly declare properties as non-atomic, use BOOL type --- EDQueue/EDQueue.h | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/EDQueue/EDQueue.h b/EDQueue/EDQueue.h index e92db86..da14d2a 100755 --- a/EDQueue/EDQueue.h +++ b/EDQueue/EDQueue.h @@ -8,8 +8,6 @@ #import -// - typedef NS_ENUM(NSInteger, EDQueueResult) { EDQueueResultSuccess = 0, EDQueueResultFail, @@ -27,20 +25,21 @@ extern NSString *const EDQueueDidDrain; @protocol EDQueueDelegate; @interface EDQueue : NSObject -@property (weak) id delegate; -@property (readonly) Boolean isRunning; -@property (readonly) Boolean isActive; -@property NSUInteger retryLimit; - + (EDQueue *)sharedInstance; -- (void)enqueueWithData:(id)data forTask:(NSString *)task; +@property (nonatomic, weak) id delegate; + +@property (nonatomic, readonly) BOOL isRunning; +@property (nonatomic, readonly) BOOL isActive; +@property (nonatomic) NSUInteger retryLimit; + +- (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 From 83a7865ae68bd233c8da03d68ab42a03f1121247 Mon Sep 17 00:00:00 2001 From: Patrick Piemonte Date: Tue, 28 Jan 2014 10:35:23 -0800 Subject: [PATCH 07/12] EDQueue, object's calloc'd --- EDQueue/EDQueue.m | 2 -- 1 file changed, 2 deletions(-) diff --git a/EDQueue/EDQueue.m b/EDQueue/EDQueue.m index ce5f2ad..a50a75c 100755 --- a/EDQueue/EDQueue.m +++ b/EDQueue/EDQueue.m @@ -48,8 +48,6 @@ - (id)init self = [super init]; if (self) { _engine = [[EDQueueStorageEngine alloc] init]; - _isRunning = false; - _isActive = false; _retryLimit = 4; } return self; From 6011d89f9e8ff886975562911bf124ae71f9da01 Mon Sep 17 00:00:00 2001 From: Patrick Piemonte Date: Tue, 28 Jan 2014 10:36:23 -0800 Subject: [PATCH 08/12] EDQueue, explicitly declare ivars, use BOOL type --- EDQueue/EDQueue.m | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/EDQueue/EDQueue.m b/EDQueue/EDQueue.m index a50a75c..41cb57c 100755 --- a/EDQueue/EDQueue.m +++ b/EDQueue/EDQueue.m @@ -17,18 +17,24 @@ @interface EDQueue () { + BOOL _isRunning; + BOOL _isActive; + NSUInteger _retryLimit; } -@property EDQueueStorageEngine *engine; -@property (readwrite) Boolean isRunning; -@property (readwrite) Boolean isActive; -@property (readwrite) NSString *activeTask; +@property (nonatomic) EDQueueStorageEngine *engine; +@property (nonatomic, readwrite) NSString *activeTask; + @end // @implementation EDQueue +@synthesize isRunning = _isRunning; +@synthesize isActive = _isActive; +@synthesize retryLimit = _retryLimit; + #pragma mark - Singleton + (EDQueue *)sharedInstance @@ -77,9 +83,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; } @@ -90,9 +96,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; } @@ -117,7 +123,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]; } @@ -132,7 +138,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]; } } @@ -164,7 +170,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"]; @@ -208,7 +214,7 @@ - (void)processJob:(NSDictionary*)job withResult:(EDQueueResult)result } // Clean-up - self.isActive = false; + _isActive = NO; // Drain if ([self.engine fetchJobCount] == 0) { From 33f55d27d770f1421ac87e29984003024f12acd9 Mon Sep 17 00:00:00 2001 From: Patrick Piemonte Date: Tue, 28 Jan 2014 10:36:41 -0800 Subject: [PATCH 09/12] EDQueue, move dealloc to init --- EDQueue/EDQueue.m | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/EDQueue/EDQueue.m b/EDQueue/EDQueue.m index 41cb57c..8658c1a 100755 --- a/EDQueue/EDQueue.m +++ b/EDQueue/EDQueue.m @@ -59,6 +59,12 @@ - (id)init return self; } +- (void)dealloc +{ + self.delegate = nil; + _engine = nil; +} + #pragma mark - Public methods /** @@ -250,12 +256,4 @@ - (void)errorWithMessage:(NSString *)message NSLog(@"EDQueue Error: %@", message); } -#pragma mark - Dealloc - -- (void)dealloc -{ - self.delegate = nil; - _engine = nil; -} - @end From 9d7c323c324191e884c2b0a19fb6284782668fe5 Mon Sep 17 00:00:00 2001 From: Patrick Piemonte Date: Tue, 28 Jan 2014 10:37:28 -0800 Subject: [PATCH 10/12] EDQueueStorageEngine, hide types internally --- EDQueue/EDQueueStorageEngine.h | 6 +----- EDQueue/EDQueueStorageEngine.m | 5 +++++ 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/EDQueue/EDQueueStorageEngine.h b/EDQueue/EDQueueStorageEngine.h index d0b33c2..aaf76ec 100755 --- a/EDQueue/EDQueueStorageEngine.h +++ b/EDQueue/EDQueueStorageEngine.h @@ -8,11 +8,7 @@ #import -#import "FMDatabase.h" -#import "FMDatabaseAdditions.h" -#import "FMDatabasePool.h" -#import "FMDatabaseQueue.h" - +@class FMDatabaseQueue; @interface EDQueueStorageEngine : NSObject @property (retain) FMDatabaseQueue *queue; diff --git a/EDQueue/EDQueueStorageEngine.m b/EDQueue/EDQueueStorageEngine.m index a2dc3e1..5426faa 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 From ba828a2cc6bd6a57ea9c447046b46372e9289902 Mon Sep 17 00:00:00 2001 From: Patrick Piemonte Date: Tue, 28 Jan 2014 10:41:15 -0800 Subject: [PATCH 11/12] EDQueueStorageEngine, move dealloc under init --- EDQueue/EDQueueStorageEngine.m | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/EDQueue/EDQueueStorageEngine.m b/EDQueue/EDQueueStorageEngine.m index 5426faa..ae11a42 100755 --- a/EDQueue/EDQueueStorageEngine.m +++ b/EDQueue/EDQueueStorageEngine.m @@ -39,6 +39,11 @@ - (id)init return self; } +- (void)dealloc +{ + _queue = nil; +} + #pragma mark - Public methods /** @@ -220,11 +225,4 @@ - (Boolean)databaseHadError:(Boolean)flag fromDatabase:(FMDatabase *)db return flag; } -#pragma mark - Dealloc - -- (void)dealloc -{ - _queue = nil; -} - @end From a7550d277ad677c0274cf074c1eeedd03e115608 Mon Sep 17 00:00:00 2001 From: Patrick Piemonte Date: Tue, 28 Jan 2014 10:42:07 -0800 Subject: [PATCH 12/12] EDQueueStorageEngine, use BOOL type, rename private methods with _* --- EDQueue/EDQueueStorageEngine.h | 2 +- EDQueue/EDQueueStorageEngine.m | 34 +++++++++++++++------------------- 2 files changed, 16 insertions(+), 20 deletions(-) diff --git a/EDQueue/EDQueueStorageEngine.h b/EDQueue/EDQueueStorageEngine.h index aaf76ec..aec98f4 100755 --- a/EDQueue/EDQueueStorageEngine.h +++ b/EDQueue/EDQueueStorageEngine.h @@ -14,7 +14,7 @@ @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 ae11a42..9d2e907 100755 --- a/EDQueue/EDQueueStorageEngine.m +++ b/EDQueue/EDQueueStorageEngine.m @@ -30,12 +30,10 @@ - (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; } @@ -55,13 +53,12 @@ - (void)dealloc * @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]; }]; } @@ -72,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); @@ -101,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]; }]; } @@ -116,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 * @@ -130,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]; }]; } @@ -145,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"]; @@ -168,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]; @@ -193,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]; @@ -207,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"]], @@ -219,7 +215,7 @@ - (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;