使用NSInputStream读取动态增长的文件

时间:2014-12-25 09:36:02

标签: objective-c c macos

我应该使用Objective-C来阅读一些缓慢增长的文件(在Mac OS X下)。

"慢慢"意思是我在EOF变大之前读到它。

在普通同步C的POSIX代码中,我可以这样做:

while(1)
{
    res = select(fd+1,&fdset,NULL,&fdset,some_timeout);
    if(res > 0)
    {
        len = read(fd,buf,sizeof(buf));
        if (len>0)
        {
            printf("Could read %u bytes. Continue.\n", len);
        }
        else
        {
            sleep(some_timeout_in_sec);
        }
    }
}

现在我想以某种异步方式重新编写它,使用NSInputSource或其他一些异步Objective-C技术。

NSInputSource的问题:如果我使用scheduleInRunLoop:方法,那么一旦我收到NSStreamEventEndEncountered事件,我就会停止接收任何事件。

我仍然可以使用NSInputSource,还是应该以某种方式传递给NSFileHandle或者你会推荐什么?

1 个答案:

答案 0 :(得分:0)

我看到一些问题。

1)some_Timeout,对于select()需要是struct timeval *。

2)对于sleep()some_timeout需要是整数秒。

3)some_timeout中的值通过select()递减(这就是为什么最后一个参数是指向struct timeval *的指针。并且在每次调用select()之前需要重新初始化该结构。

4)select()的参数是感兴趣的最高fd + 1,然后是三个独立的struct fd_set *对象。第一个用于输入文件,第二个用于输出文件,第三个用于例外,但是,发布的代码对输入和异常使用相同的struct fd_set,这可能不是所需的。

当纠正上述问题时,代码应该有效。