2015-12-21 32 views
2

我想创建自定义框架,将处理ExternalAccessory.framework做连接附件的读/写操作。NSOutputStream阻止,HasBytesAvailable事件没有被触发

我能够创建一个会话并打开设备来执行读/写操作。 我面临的问题是,当我尝试从应用程序使用NSOutputStream.write写入数据时,附件成功接收数据,但之后UI未响应并且数据返回字节附件未被应用程序接收(HasBytesAvailable未被调用)

这里我在ViewDidLoad()

let runLoop = NSRunLoop.currentRunLoop() 
sessionHandler.openDeviceWithProtocolString(runLoop) 

@IBAction调用sessionHandler._WriteData()

let sessionHandler = SessionHandler().sharedController() 

SessionHandler类是我的自定义SDK内(自定义框架)

这里我SessionHandler

import UIKit 
import ExternalAccessory 


public class SessionHandler: NSObject, NSStreamDelegate { 

    var readData: NSMutableData? 
    var writeData: NSMutableData? 
    var _session: EASession? 

    public func sharedController() -> SessionHandler{ 
     var sessionController: SessionHandler? 
     if sessionController == nil { 
      sessionController = SessionHandler() 
     } 
     return sessionController! 
    } 

    func getConnectedAccessoris() -> Array<EAAccessory>{ 
     let accessories : Array<EAAccessory> = EAAccessoryManager.sharedAccessoryManager().connectedAccessories 
     return accessories 
    } 


    public func openDeviceWithProtocolString(_runLoop: NSRunLoop){ 
     print("Inside openDeviceWithProtocolString") 
     let _accessories = getConnectedAccessoris() 
     var _accessory: EAAccessory? 
     for acsy in _accessories { 
      if acsy.protocolStrings.contains("my.protocol.string") { 
       _accessory = acsy 
      } 
     } 
     if _accessory != nil { 
      _session = EASession(accessory: _accessory!, forProtocol: "my.protocol.string") 
      print("EASession create :: \(_session)") 
      if _session != nil { 

       _session?.inputStream?.delegate = self 
       _session?.inputStream?.scheduleInRunLoop(_runLoop, forMode: NSDefaultRunLoopMode) 
       _session?.inputStream?.open() 
       print("Input stream Opened") 
       _session?.outputStream?.delegate = self 
       _session?.outputStream?.scheduleInRunLoop(_runLoop, forMode: NSDefaultRunLoopMode) 
       _session?.outputStream?.open() 
       print("Output Stream Opened") 
      }else { 
       print("SessionHandler : session nil") 
      } 
     } 
    } 



    public func _readData() { 
     print("Trying to read data") 
     let INPUT_BUFFER_SIZE = 65536 
     let buf = UnsafeMutablePointer<UInt8>.alloc(INPUT_BUFFER_SIZE) 
     while ((_session?.inputStream?.hasBytesAvailable) != nil) { 
      let bytesRead = _session?.inputStream?.read(buf, maxLength: INPUT_BUFFER_SIZE) 
      if readData == nil { 
       readData = NSMutableData() 
      } 
      readData?.appendBytes(buf, length: bytesRead!) 
     } 
     if readData != nil { 
      let data: NSData = readData! 
      let count = data.length/sizeof(UInt8) 

      // create an array of Uint8 
      var array = [UInt8](count: count, repeatedValue: 0) 

      // copy bytes into array 
      data.getBytes(&array, length:count * sizeof(UInt8)) 
      print("Data Received :: \(array)") 
      validateData(array) 
     } 
    } 

    public func _writeData() { 

     while _session?.outputStream?.hasSpaceAvailable != nil && writeData?.length > 0 { 
      print("Writting bytes :: \(writeData?.bytes)") 
      let bytesWritten = _session?.outputStream?.write(UnsafePointer<UInt8>((writeData?.bytes)!), maxLength: (writeData?.length)!) 
      print("written bytes : \(bytesWritten)") 
      if bytesWritten == -1 { 
       //Write error 
       print("written error") 
       break 
      }else if bytesWritten > 0 { 
       print("Written success") 
       validateData(writeData) 
       writeData?.replaceBytesInRange(NSMakeRange(0, bytesWritten!), withBytes: nil, length: 0) 
      } 
     } 
    } 


    func stream(aStream: NSStream, handleEvent eventCode: NSStreamEvent) { 
     switch (eventCode) { 
     case NSStreamEvent.None: 
      print("NSStream None") 
      break 
     case NSStreamEvent.OpenCompleted: 
      print("Open Completed") 
      break 
     case NSStreamEvent.HasBytesAvailable: 
      print("Has Bytes Available") 
      _readData() 
      break 
     case NSStreamEvent.HasSpaceAvailable: 
      print("Hase space Available") 
      _writeData() 
      break 
     case NSStreamEvent.ErrorOccurred: 
      print("Error occurred") 
      break 
     case NSStreamEvent.EndEncountered: 
      print("End Encountered") 
      break 
     default: 
      print("No stream event") 
      break 
     } 
    } 
} 

在此先感谢..

回答

0
sessionHandler.openDeviceWithProtocolString(runLoop) 

是不是应该被另一个线程调用?