【问题标题】:Reading dynamically growing file using NSInputStream使用 NSInputStream 读取动态增长的文件
【发布时间】:2014-12-25 09:36:01
【问题描述】:

我应该使用 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 或者你会推荐什么?

【问题讨论】:

    标签: objective-c c macos


    【解决方案1】:

    我发现了一些问题。

    1) some_Timeout,因为 select() 需要是一个 struct timeval *。

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

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

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

    当上述问题得到纠正后,代码应该可以工作了。

    【讨论】:

    • 这没有回答问题。问题是关于 NSInputStream。
    猜你喜欢
    • 2020-02-09
    • 2013-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多