Проблема в том, что данные продолжают записывать в oSream снова и снова. Как остановить это, когда все данные отправлены?
Видите, это опасность мышления пассивным голосом. Перепишите вопрос активным голосом:
Проблема в том, что данные продолжают записываться в oSream снова и снова. Как остановить это, когда я отправил все данные?
И вы почти ответили на свой вопрос.
Большая часть проблемы - ваш обработчик HasSpaceAvailable
. Вот что вы делаете:
- Создание полного представления JPEG изображения (каждый раз)
- Отправка длины представления (каждый раз)
- Отправка первой части представления (каждый раз)
Это три проблемы, и вам нужно решить все три.
- Создайте представление JPEG один раз.
- Отправьте длину представления только один раз.
- Следите за тем, что вы уже отправили, и отправляйте только первую часть того, чего у вас нет.
Чтобы сделать все три, поместите длину в NSMutableData и добавьте представление JPEG к нему. Затем сохраните этот новый объект данных и получите дополнительные переменные экземпляра для байтового указателя и оставшейся длины. Вы сделаете все это до того, как попадете в состояние HasSpaceAvailable
.
Тогда, когда вы доберетесь до HasSpaceAvailable
, не отправляйте длину отдельно, потому что вы поместили ее в объект данных. Вам нужно только отправить байты из переменной экземпляра указателя с длиной, оставшейся в качестве максимальной длины. После того, как вы проверите, что количество отправленных байтов не было 0 или -1 (см. документацию ), добавьте его к указателю и вычтите его из оставшейся длины.
Когда оставшаяся длина достигает нуля, вы отправили все. Предполагая, что вы не хотите отслеживать данные JPEG чем-либо, вы можете закрыть поток.