我正在使用 FMDB 来处理运行良好的数据库。该应用程序使用一个后台线程,该线程正在做一些工作并需要访问数据库。同时主线程需要在同一个数据库上运行一些查询。FMDB 本身有一个小锁定系统,但是,我在我的课程中添加了另一个。
仅当我的班级指示数据库未在使用时,才会执行每个查询。执行操作后,数据库将解锁。只要负载不太高,就可以按预期工作。当我使用在主线程上运行的线程访问大量数据时,会发生 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)”添加互斥锁的原因。然而,这并没有帮助。
有人有线索吗?