Зная, что данные из NSStream завершены

Я отправляю блоки данных UIImage через MCSession с NSStream.

Когда я получаю байты

- (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode {

   if (eventCode == NSStreamEventHasBytesAvailable) {

      // read data and append to self.data
      // how to know that self.data can be used to create UIImage

   }

}

Я добавляю их к изменяемому экземпляру данных. Проблема в том, как узнать, что накопленные данные представляют собой полное изображение, чтобы я мог использовать -[UIImage initWithData:] для его создания?


person Peter Lapisu    schedule 03.12.2014    source источник


Ответы (2)


Вы должны следить за NSStreamEventEndEncountered

person Lance    schedule 03.12.2014
comment
NSStreamEventEndEncountered полезен только тогда, когда поток был завершен, что не так (в этом случае поток = 1 изображение, в этом случае поток = n изображений)... или лучше использовать 1 поток на изображение? - person Peter Lapisu; 03.12.2014
comment
иметь один поток на изображение, безусловно, один из способов сделать это, да :) - person Lance; 03.12.2014
comment
@Lance, но как узнать, когда открывать InputStream, чтобы получить это изображение? Возможно, для отправителя подходит одно изображение — один поток: вы хотите отправить изображение —> вы открываете поток —> пишете фрагменты —> закрываете поток. Но как приемник будет обрабатывать входящие изображения, если их несколько? - person kas-kad; 17.10.2015

Поток не знает своего содержимого. Если вы не можете полагаться на окончание потока, чтобы сказать вам, что данные завершены, то вам нужно либо использовать/создать какой-то протокол для передачи, который включает «готовый» сигнал, либо просто попытаться создать образ и принять соответствующие действия, если это не удается.

person jscs    schedule 03.12.2014
comment
что является подходящим "законченным" сигналом? - person Peter Lapisu; 03.12.2014
comment
Зависит от вашего приложения. Вам придется придумать какой-то формат пакета с заголовком для каждого отправляемого фрагмента. - person jscs; 03.12.2014
comment
теперь я начинаю получать правильный трек, я мог бы зарезервировать последние 4 байта буфера для 0/1, что указывало бы на то, что полный объект был отправлен ... как вы думаете, лучше сделать это таким образом, или иметь поток за изображение? - person Peter Lapisu; 03.12.2014
comment
Написание собственного протокола передачи, похоже, быстро усложнится. Я бы предложил использовать существующие функциональные возможности потока, насколько это возможно, и да, позволить одному потоку передавать одно изображение. - person jscs; 03.12.2014
comment
@JoshCaswell, но как узнать, когда открывать InputStream, чтобы получить это изображение? Возможно, для отправителя подходит одно изображение — один поток: вы хотите отправить изображение —> вы открываете поток —> пишете фрагменты —> закрываете поток. Но как приемник будет обрабатывать входящие изображения, если их несколько, отправленных по нескольким потокам? Я новичок в стримах. - person kas-kad; 17.10.2015