我正在使用FMDB处理我的数据库,它工作正常。该应用程序使用后台线程正在做一些工作,需要访问数据库。同时主线程需要在同一个数据库上运行一些查询。 FMDB本身有一个小小的锁定系统,但是,我在课堂上添加了另一个锁定系统。当在iOS 4.0上使用SQLite(FMDB)和线程时EXC_BAD_ACCESS
只有当我的类指示数据库未被使用时才会执行每个查询。执行操作后,数据库将被解锁。只要负载不太高,它就可以按预期工作。当我使用主线程上运行的线程访问大量数据时,会出现EXC_BAD_ACCESS错误。
这里是寻找:
- (BOOL)isDatabaseLocked {
return isDatabaseLocked;
}
- (Pile *)lockDatabase {
isDatabaseLocked = YES;
return self;
}
- (FMDatabase *)lockedDatabase {
@synchronized(self) {
while ([self isDatabaseLocked]) {
usleep(20);
//NSLog(@"Waiting until database gets unlocked...");
}
isDatabaseLocked = YES;
return self.database;
}
}
- (Pile *)unlockDatabase {
isDatabaseLocked = NO;
return self;
}
调试器说,在[FMResultSet next]
出现在该行
rc = sqlite3_step(statement.statement);
我仔细检查了所有的保留计数和所有的对象都在这个时候存在误差。同样,它只发生在主线程在后台线程运行时启动大量查询(这本身总是产生大量负载)。错误总是由主线程产生,而不是由后台线程产生。
我最后的想法是,这两个线程在同一时间运行lockedDatabase这样他们就可以得到一个数据库对象。这就是为什么我通过“@synchronized(self)”添加了互斥锁。但是,这并没有帮助。
有没有人有线索?
这线程的FMDB问题给出了一些其他有用的见解可能的原因:https://github.com/ccgus/fmdb/issues/39 – 2015-04-17 19:01:13