与这个 SO question相关,我想将数据加载放在后台。
但是,我收到“按顺序调用的库例程”错误。
在这个 SO 线程中说方法是使用 NSOperation,但是查看网络上的示例我不知道如何解决这个问题。
我与单例模式共享一个 sqlite 连接:
@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];
}
db 接口的代码位于http://code.google.com/p/chibiorm/source/browse/#svn/trunk/src — 特别是 Db.h/m 是唯一与 fdbm/ 接口的单元sqlite。
尝试从 FDBM 调用 sqlite 函数时发生错误。
例如发生在这里:
-(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);
}