2016-10-18 3 views
-2

私はMac OSXアプリケーションで作業しています。これはChromeネイティブメッセージングホストアプリケーションとして機能します。ネイティブメッセージAPI標準に準拠して、メッセージはChrome拡張機能とMacアプリ間でのみ標準IO(stdin、stdout)で共有できます。Macアプリケーションからstdioを読む

私はSwift 3.0から利用可能なreadLine()関数でこれを実装しようとしましたが、FileHandleで従来の方法で試してみました。

しかし、これらの実装はメインスレッドでいくつかの奇妙な問題を引き起こします。

誰にでも解決策や参考資料をご提案いただけますか?

+2

私は「誰でも、(言語)でSTDIOを行うソリューションを提案できますか?」というのは、「研究なし」という質問のゴールデンスタンダードだと思います。 – Xan

+0

@Xanご参考までに、私に参照リンクを提供してください。私はすでにMacのコマンドラインツールでこれを行っていますが、OSXアプリケーションでは、いくつかのスレッドの問題を抱えています。 – itZme

+3

私はObj-CやSwiftに一度も触れたことがないので、私は何も持っていないと認めなければなりません。しかし、すでに試してみたがうまくいかなかった場合は、あなたが何をしようとしたかを明らかにするか、より良いことを示す必要があります。 – Xan

答えて

0

NSFileHandleでは、ファイル記述子のラッパーがソリューションです。ファイルハンドルオブジェクトを使用して、ファイル、ソケット、パイプ、およびデバイスに関連付けられたデータにアクセスできます。ファイルの場合は、ファイル内の読み込み、書き込み、検索ができます。

DispatchQueue.global(qos: .background).async { 
     let input = FileHandle.standardInput 
     var aStr : String! 
     while true { 
      //Read first 4 bytes to get message length details(As per NativeMessagingAPI protocol) 
      let lengthDetails = input.readData(ofLength:4) 
      let length = lengthDetails.withUnsafeBytes { (ptr: UnsafePointer<Int32>) -> Int32 in 
       return ptr.pointee 
      } 
      let data = input.readData(ofLength:Int(length))//input.availableData 
      if (data.count > 0) { 
       var aStr = String(data:data, encoding:String.Encoding.utf8) 
       if (aStr != nil) { 
        DispatchQueue.main.async { 
         //Handle data logic here 
        } 
       } 
      } 
     } 

    } 
関連する問題