我在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/

10-11 16:41