В связи с этим SO-вопросом я хочу перевести загрузку данных в фоновый режим.
Тем не менее, я получаю ошибки «библиотечная процедура, вызванная вне последовательности».
В этот поток SO скажите, что способ использовать NSOperation, но, глядя на образцы в Интернете, я не знаю, как это может решить проблему.
Я разделяю одно соединение sqlite с шаблоном singleton:
@interface Db : NSObject {
NSString *path;
FMDatabase* theDb;
BOOL isOpen;
}
@property (retain, nonatomic) FMDatabase *theDb;
@property (retain, nonatomic) NSString *path;
@property (nonatomic) BOOL isOpen;
--------
static Db *currentDbSingleton = nil;
#pragma mark Global access
+(id)currentDb {
@synchronized(self) {
if (!currentDbSingleton) {
NSString *reason = NSLocalizedString(@"The database is not set globally",
@"Error Db: database is not set");
NSException *e = [NSException exceptionWithName:@"DBError"
reason:reason;
userInfo:nil];
@throw e;
}
}
return currentDbSingleton;
}
Так труднее открыть дважды один и тот же дб....
Любые идеи?
ИЗМЕНИТЬ:
Я подтвердил, что ошибка связана с вызовом sqlite. Я использую FDBM в качестве тонкой оболочки для его вызова.
Я запускаю 2 потока: основной и фоновый для загрузки данных. Я запускаю это так:
- (void) fillCache:(NSString *)theTable {
[NSThread detachNewThreadSelector:@selector(fillCacheBackground:)
toTarget:self
withObject:theTable];
}
- (void)loadComplete {
[self.table reloadData];
}
- (void) fillCacheBackground:(NSString *)theTable {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
Db *db= [Db currentDb];
[db beginTransaction];
..... STUFF HERE
[db commitTransaction];
//Tell our callback what we've done
[self performSelectorOnMainThread:@selector(loadComplete)
withObject:nil
waitUntilDone:YES];
[pool drain];
}
Код интерфейса БД находится по адресу http://code.google.com/p/chibiorm/source/browse/#svn/trunk/src — в частности, Db.h/m, которые являются единственными модулями, взаимодействующими с fdbm/sqlite.
Ошибка произошла при попытке вызвать функции sqlite из FDBM.
Например произошло здесь:
-(void) checkError {
if ([self.theDb hadError]) { // <====ERROR HERE
NSLog(@"Err %d: %@", [self.theDb lastErrorCode], [self.theDb]);
}
}
Это вызывает код FDBM:
- (BOOL) hadError {
int lastErrCode = sqlite3_errcode(db);
return (lastErrCode > SQLITE_OK && lastErrCode < SQLITE_ROW);
}