2017-02-07 9 views
0

спасибо, что нашли время, чтобы прочитать мой вопрос.iOS - отправка и получение данных одновременно

В основном я подключаюсь к другому устройству с использованием MultipeerConnectivity, и я хочу передавать данные на другое устройство во время приема данных.

Моя проблема заключается в том, что одно из устройств завершает передачу только данных, а другое устройство получает только его получение.

Это мой метод отправки. Этот метод является методом делегата из AVCaptureAudioDataOutputSampleBufferDelegate, поэтому он автоматически вызывается.

func captureOutput(_ captureOutput: AVCaptureOutput!, didOutputSampleBuffer sampleBuffer: CMSampleBuffer!, from connection: AVCaptureConnection!) { 
    //------------------------------------------------------- 
    // Writing to output stream 

    var blockBuffer: CMBlockBuffer? 
    var audioBufferList: AudioBufferList = AudioBufferList.init() 

    CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer(sampleBuffer, nil, &audioBufferList, MemoryLayout<AudioBufferList>.size, nil, nil, kCMSampleBufferFlag_AudioBufferList_Assure16ByteAlignment, &blockBuffer) 
    let buffers = UnsafeMutableAudioBufferListPointer(&audioBufferList) 

    for buffer in buffers { 
     let u8ptr = buffer.mData!.assumingMemoryBound(to: UInt8.self) 
     let output = outputStream!.write(u8ptr, maxLength: Int(buffer.mDataByteSize)) 

     if (output == -1) { 
      let error = outputStream?.streamError 
      print("\(#file) > \(#function) > Error on outputStream: \(error!.localizedDescription)") 
     } 
     else { 
      print("\(#file) > \(#function) > Data sent") 
     } 
    } 
} 

И вот мой метод получения (я занимаюсь другими событиями потока, которые здесь просто неактуальны). Вы можете игнорировать все связанные с аудио материалы, это не работает прямо сейчас, но это не моя основная проблема. Этот метод является делегатом OutputStream, поэтому он также автоматически вызывается, когда данные доступны из потока.

func stream(_ aStream: Stream, handle eventCode: Stream.Event) { 
    case Stream.Event.hasBytesAvailable: 
     print("\(#file) > \(#function) > New data has arrived") 
     readFromStream() 
} 


func readFromStream() { 
    while (inputStream!.hasBytesAvailable) { 
     var buffer = [UInt8](repeating: 0, count: 4096) 
     let length = inputStream!.read(&buffer, maxLength: buffer.count) 

     if (length > 0) { 

      if (audioEngine!.isRunning) { 
       print("\(#file) > \(#function) > audioEngine is running") 
       audioEngine!.stop() 
       audioEngine!.reset() 
      } 
      else { 
       print("\(#file) > \(#function) > audioEngine is NOT running") 
      } 

      print("\(#file) > \(#function) > \(length) bytes read") 

      let audioBuffer = bytesToAudioBuffer(buffer) 
      let mainMixer = audioEngine!.mainMixerNode 

      audioEngine!.connect(audioPlayer!, to: mainMixer, format: audioBuffer.format) 
      audioPlayer!.scheduleBuffer(audioBuffer, completionHandler: nil) 

      do { 
       try audioEngine!.start() 
      } 
      catch let error as NSError { 
       print("\(#file) > \(#function) > error: \(error.localizedDescription)") 
      } 
      audioPlayer!.play() 
     } 
    } 
} 

Из этих двух методов вы можете видеть, что у меня есть операторы печати, когда данные поступают и когда данные отправляются. На одном из устройств я в конечном итоге постоянно считываю данные и никогда не отправляю их, а на другом устройстве я постоянно отправляю данные и никогда не получаю их.

Я предполагаю, что это потому, что я не использую нитки. Но я никогда не работал с потоками в iOS. Если это так, может ли кто-нибудь помочь мне в том, как это сделать?

Если вам нужна дополнительная информация, пожалуйста, дайте мне знать.

ответ

0

В конце концов я выяснить реальный способ использовать темы:

пусть streamReceiverQueue = DispatchQueue (метка: "newQueue", QOS: DispatchQoS.userInteractive)

streamReceiverQueue.sync { 
    // code here 
} 

streamReceiverQueue.async { 
    // code here 
}