From 6ba4c3a6b913a3c2a3b42c84835ddf6b5014a057 Mon Sep 17 00:00:00 2001 From: Sunil Sharma <sunilsharma.ss08@gmail.com> Date: Mon, 22 Feb 2016 14:40:38 +0530 Subject: [PATCH 1/2] Asynchronously perform database operations on queue, using transactions. --- src/fmdb/FMDatabaseQueue.h | 7 +++++++ src/fmdb/FMDatabaseQueue.m | 31 +++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/src/fmdb/FMDatabaseQueue.h b/src/fmdb/FMDatabaseQueue.h index ae45b658..a281d22e 100644 --- a/src/fmdb/FMDatabaseQueue.h +++ b/src/fmdb/FMDatabaseQueue.h @@ -158,6 +158,13 @@ - (void)inTransaction:(void (^)(FMDatabase *db, BOOL *rollback))block; +/** Asynchronously perform database operations on queue, using transactions. + + @param block The code to be run on the queue of `FMDatabaseQueue` + */ + +- (void)inTransactionAsync:(void (^)(FMDatabase *db, BOOL *rollback))block; + /** Synchronously perform database operations on queue, using deferred transactions. @param block The code to be run on the queue of `FMDatabaseQueue` diff --git a/src/fmdb/FMDatabaseQueue.m b/src/fmdb/FMDatabaseQueue.m index c877a341..7f885cab 100644 --- a/src/fmdb/FMDatabaseQueue.m +++ b/src/fmdb/FMDatabaseQueue.m @@ -210,6 +210,37 @@ - (void)inTransaction:(void (^)(FMDatabase *db, BOOL *rollback))block { [self beginTransaction:NO withBlock:block]; } +- (void)inTransactionAsync:(void (^)(FMDatabase *db, BOOL *rollback))block{ + [self beginTransactionAsync:NO withBlock:block]; +} + +- (void)beginTransactionAsync:(BOOL)useDeferred withBlock:(void (^)(FMDatabase *db, BOOL *rollback))block { + FMDBRetain(self); + dispatch_async(_queue, ^() { + + BOOL shouldRollback = NO; + + if (useDeferred) { + [[self database] beginDeferredTransaction]; + } + else { + [[self database] beginTransaction]; + } + + block([self database], &shouldRollback); + + if (shouldRollback) { + [[self database] rollback]; + } + else { + [[self database] commit]; + } + }); + + FMDBRelease(self); +} + + - (NSError*)inSavePoint:(void (^)(FMDatabase *db, BOOL *rollback))block { #if SQLITE_VERSION_NUMBER >= 3007000 static unsigned long savePointIdx = 0; From a55602c2d899be4c6bd81202f2479bc2933d5ee3 Mon Sep 17 00:00:00 2001 From: Sunil Sharma <sunilsharma.ss08@gmail.com> Date: Wed, 24 Feb 2016 15:35:14 +0530 Subject: [PATCH 2/2] FMDBRetain and FMDBRelease has been put inside the asynchronous block --- src/fmdb/FMDatabaseQueue.m | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/fmdb/FMDatabaseQueue.m b/src/fmdb/FMDatabaseQueue.m index 7f885cab..be2088fc 100644 --- a/src/fmdb/FMDatabaseQueue.m +++ b/src/fmdb/FMDatabaseQueue.m @@ -215,9 +215,9 @@ - (void)inTransactionAsync:(void (^)(FMDatabase *db, BOOL *rollback))block{ } - (void)beginTransactionAsync:(BOOL)useDeferred withBlock:(void (^)(FMDatabase *db, BOOL *rollback))block { - FMDBRetain(self); + dispatch_async(_queue, ^() { - + FMDBRetain(self); BOOL shouldRollback = NO; if (useDeferred) { @@ -235,9 +235,9 @@ - (void)beginTransactionAsync:(BOOL)useDeferred withBlock:(void (^)(FMDatabase * else { [[self database] commit]; } + FMDBRelease(self); }); - FMDBRelease(self); }