我应该使用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或者你会推荐什么?
答案 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,这可能不是所需的。
当纠正上述问题时,代码应该有效。