我在Objective-C中编写一个PostgreSQL库,基于libpq(用C编写)。虽然我已经成功地构建了一个使用PQexec
的同步查询方法,但我的异步方法从未收到查询的结果。PQgetResult
总是返回NULL
。
我尝试了各种连接和查询检查的组合,但都没有解决问题。查询本身是具有一行的表上的SELECT
。我可以将这个异步方法换成同步方法,并拥有所需的行为。我还检查了我保留的指针是否始终引用同一个对象。
我没有使用单行模式。
+ (instancetype) resultSetWithQuery: (NSString*) query usingConnection: (PGConnection*) conn whenComplete: (Callback) callback {
PGResultSet* resultSet = [[PGResultSet alloc] init];
NSString* encoding = [conn encoding];
int success = PQsendQuery([conn conn], [query UTF8String]);
[resultSet setEncoding:encoding];
[resultSet setQuery:query];
[resultSet setConn:conn];
if(success){
NSTimeInterval timeInterval = 0.5;
NSTimer* checkStatus = [NSTimer scheduledTimerWithTimeInterval:timeInterval
target:resultSet
selector:@selector(checkIfComplete)
userInfo:nil
repeats:YES];
[resultSet setTimer:checkStatus];
[resultSet setCallback:callback];
}
return resultSet;
}
- (void)checkIfComplete{
if(!PQconsumeInput([[self conn] conn])){
[[self timer] invalidate];
}
if(PQisBusy([[self conn] conn])){
return;
}
// result is always NULL
PGresult* result = PQgetResult([[self conn] conn]);
// ...
}
最佳答案
为了帮助调试该问题,我使用调试级别设置启动了PostgreSQL服务器:
$ postgres -d 2
在查看日志之后,我看到在同一个
PGconn
连接实例上执行了其他查询。我相信我的问题源于这一连串的事件:
对查询调用
PQsendQuery
。对新查询调用
PQexec
。调用
PQgetResult
以获得PQsendQuery
的结果。在这种情况下,
PQgetResult
将返回NULL
,尽管查询有效且已成功执行。解决方案:在多线程或异步环境中,您需要创建一个队列来管理到连接实例的查询;pqlib不会代表您这样做。尽管在多个异步操作中可能会出现这种情况,但对于单个同步操作和单个异步操作也是如此。
关于objective-c - PQgetResult总是返回NULL,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27710422/