菜鸟教程小白 发表于 2022-12-13 11:12:18

ios - 无法为标准输出管道触发 NSFileHandleDataAvailableNotification


                                            <p><p>我们需要在 iOS 中捕获标准输出,因为我们使用的是通过标准输入/标准输出进行通信的开源项目</p>

<p>这行得通:</p>

<pre><code>NSPipe *pipe = ;
NSFileHandle *readh = ;

dup2([ fileDescriptor], fileno(stdout));

[@&#34;Hello iOS World!&#34; writeToFile:@&#34;/dev/stdout&#34; atomically:NO encoding:NSUTF8StringEncoding error:nil];

NSData *data = ;
NSLog(@&#34;%d&#34;, );
NSString *str = [ initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@&#34;%@%@&#34;, @&#34;stdout captured:&#34;, 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(@&#34;inside listener&#34;);
      NSData *data = ;
      NSLog(@&#34;%d&#34;, );
      NSString *str = [ initWithData:data encoding:NSUTF8StringEncoding];
      NSLog(@&#34;%@%@&#34;, @&#34;stdout captured:&#34;, str);

    }];
    ;

    [@&#34;Hello iOS World!&#34; writeToFile:@&#34;/dev/stdout&#34; 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&#39;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]
查看完整版本: ios - 无法为标准输出管道触发 NSFileHandleDataAvailableNotification