私は 3 つの NSPipe で構成された NSTask で作業しており、standardOutput と standardError から読み取りたいと考えています。私は内部でそれを行います-stdoutの場合は1番目、stderrの場合は次です。私のコードはすでに別のスレッドで実行されているため、readInBackgroundAndNotify と waitForDataInBackgroundAndNotify を使用できません。そこで NSRunLoop を実行して新しいバックグラウンド スレッドを切り離したくありません...これらのチャネルのいずれかに存在するデータ。
だから私はこのコードを使用します:
@implementation NSFileHandle (isReadableAddon)
- (BOOL)isReadable
{
int fd = [self fileDescriptor];
fd_set fdset;
struct timeval tmout = { 0, 0 }; // return immediately
FD_ZERO(&fdset);
FD_SET(fd, &fdset);
if (select(fd + 1, &fdset, NULL, NULL, &tmout) <= 0)
return NO;
return FD_ISSET(fd, &fdset);
}
@end
ただし、isReadable が YES を返し、[fileHandle availableData] を呼び出すと、スレッドはまだブロックされます。なんで?isReadable が YES を返したときに、ブロックせずに availableData メソッドを呼び出すことを期待していました。