ios - 无法为标准输出管道触发 NSFileHandleDataAvailableNotification
<p><p>我们需要在 iOS 中捕获标准输出,因为我们使用的是通过标准输入/标准输出进行通信的开源项目</p>
<p>这行得通:</p>
<pre><code>NSPipe *pipe = ;
NSFileHandle *readh = ;
dup2([ fileDescriptor], fileno(stdout));
[@"Hello iOS World!" writeToFile:@"/dev/stdout" atomically:NO encoding:NSUTF8StringEncoding error:nil];
NSData *data = ;
NSLog(@"%d", );
NSString *str = [ initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"%@%@", @"stdout captured:", str);
</code></pre>
<p>控制台打印:</p>
<pre><code>2015-10-04 12:03:29.396 OpeningExplorer 16
2015-10-04 12:03:29.397 OpeningExplorer stdout captured:Hello iOS World!
</code></pre>
<p>但是上面的例子阻塞了。为什么下面的异步代码不起作用?</p>
<pre><code> NSPipe *pipe = ;
NSFileHandle *readh = ;
dup2([ fileDescriptor], fileno(stdout));
[ addObserverForName:NSFileHandleDataAvailableNotification
object:readh
queue:
usingBlock:^(NSNotification *note) {
NSFileHandle *fileHandle = (NSFileHandle*) ;
NSLog(@"inside listener");
NSData *data = ;
NSLog(@"%d", );
NSString *str = [ initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"%@%@", @"stdout captured:", str);
}];
;
[@"Hello iOS World!" writeToFile:@"/dev/stdout" atomically:NO encoding:NSUTF8StringEncoding error:nil];
</code></pre>
<p>通知代码块似乎没有被调用——控制台没有输出任何东西</p></p>
<br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
<p><p>来自 <a href="https://developer.apple.com/documentation/foundation/nsfilehandle/1409270-waitfordatainbackgroundandnotify?language=objc" rel="noreferrer noopener nofollow">Apple's documentation</a>在 <code>waitForDataInBackgroundAndNotify</code> 上:“您必须从具有事件运行循环的线程调用此方法。”</p>
<p>这意味着您不能从 <code>NSOperationQueue</code> 或 <code>NSThread</code> 中调用它。因此,请确保此代码是从您的主 UI 线程而不是后台线程运行的。</p>
<p>(发布以防有人像我一样懒惰并且不想解析评论以找到答案..)</p></p>
<p style="font-size: 20px;">关于ios - 无法为标准输出管道触发 NSFileHandleDataAvailableNotification,我们在Stack Overflow上找到一个类似的问题:
<a href="https://stackoverflow.com/questions/32937344/" rel="noreferrer noopener nofollow" style="color: red;">
https://stackoverflow.com/questions/32937344/
</a>
</p>
页:
[1]