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..be2088fc 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 { + + dispatch_async(_queue, ^() { + FMDBRetain(self); + 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;