sqlite and threading with iPhone SDK

后端 未结 4 540
粉色の甜心
粉色の甜心 2020-12-10 21:37

I have an iPhone app that is using sqlite 3.6 (not with FMDB) to store and load data. I load the database when the app loads and uses the same database connection through th

4条回答
  •  一整个雨季
    2020-12-10 22:04

    I've tried these two solutions and they worked perfectly. You can either use critical sections or NSOperationQueue and I prefer the first one, here is the code for both of them:

    define some class "DatabaseController" and add this code to its implementation:

    static NSString * DatabaseLock = nil;
    + (void)initialize {
        [super initialize];
        DatabaseLock = [[NSString alloc] initWithString:@"Database-Lock"];
    }
    + (NSString *)databaseLock {
        return DatabaseLock;
    }
    
    - (void)writeToDatabase1 {
        @synchronized ([DatabaseController databaseLock]) {
            // Code that writes to an sqlite3 database goes here...
        }
    }
    - (void)writeToDatabase2 {
        @synchronized ([DatabaseController databaseLock]) {
            // Code that writes to an sqlite3 database goes here...
        }
    }
    

    OR to use the NSOperationQueue you can use:

    static NSOperationQueue * DatabaseQueue = nil;
    + (void)initialize {
        [super initialize];
    
        DatabaseQueue = [[NSOperationQueue alloc] init];
        [DatabaseQueue setMaxConcurrentOperationCount:1];
    }
    + (NSOperationQueue *)databaseQueue {
        return DatabaseQueue;
    }
    
    - (void)writeToDatabase {
        NSInvocationOperation * operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(FUNCTION_THAT_WRITES_TO_DATABASE) object:nil];
        [operation setQueuePriority:NSOperationQueuePriorityHigh];
        [[DatabaseController databaseQueue] addOperations:[NSArray arrayWithObject:operation] waitUntilFinished:YES];
        [operation release];
    }
    

    these two solutions block the current thread until the writing to database is finished which you may consider in most of the cases.

提交回复
热议问题