2015-10-13 5 views
0

ЧТО ДЕЛАТЬ Я пытаюсь получить аудиофайл (может быть до часа, например, подкаст), который я записал с AVAudioRecorder, который будет загружен на наш сервер. В дополнение к тому, чтобы быть загруженным на сервер, он должен иметь возможность «приостанавливаться» и «возобновляться», если пользователь выбирает. Из-за этого, я считаю, мне нужно использовать dataWithBytesNoCopy:buffer для класса NSData.Получение байт Данные из файла

ГДЕ ИМ НА Я знаю, за то, что я могу получить данные с помощью переданной self.mediaURL свойства:

if (self.mediaURL) { 

    NSData *audioData = [NSData dataWithContentsOfURL:self.mediaURL]; 

    if (audioData) { 

     [payloadDic setObject:audioData forKey:@"audioData"]; 
    } 

} 

Однако это не дает мне нужную функциональность. Я пытаюсь отслеживать загруженные байты, чтобы возобновить работу, если пользователь делает паузу.

ВОПРОС Как можно использовать предоставленный self.mediaURL, чтобы я мог извлечь файл и вычислить длину байта, как в этом примере?

Byte *buffer = (Byte*)malloc((long)audioFile.size); 
NSUInteger buffered =[rep getBytes:buffer fromOffset:0.0 length:(long)rep.size error:nil]; 

NSMutableData *body = [[NSMutableData alloc] init]; 
body = [NSMutableData dataWithBytesNoCopy:buffer length:buffered freeWhenDone:YES]; 

ответ

1

Вместо того, чтобы сделать вещи более сложными для себя, пытаясь изобретать велосипед, используйте то, что система дает вам. NSURLSession позволяет делать background upload. Вы передаете задачу на сеанс (созданный с использованием конфигурации фонового сеанса) и просто уходите. Загрузка происходит в кусках, когда это возможно. Нет необходимости в «паузе» или «возобновлении»; система заботится обо всем. Ваше приложение даже не нужно запускать. Если требуется аутентификация, ваше приложение будет пробуждено в фоновом режиме по мере необходимости. Эта архитектура только что сделана для описываемой вами ситуации.

Если проблема заключается в том, что вам нужен произвольный доступ к данным файла без необходимости читать все это в массивных NSData, используйте NSFileHandle.

+0

Спасибо за ответ. Но наша команда явно хочет кнопку «Пауза», чтобы остановить загрузку, и кнопку «Возобновить», чтобы начать загрузку с места, в котором был остановлен файл. Таким образом, наш API будет разработан, чтобы отправить нам заголовок, как только пользователь нажмет «Возобновить», в котором будет содержаться последний байт, на котором остановилась загрузка, тогда мне нужно будет взять эту информацию и подключить ее в буфер dataWithBytesNoCopy: ', чтобы начать загрузку с правой позиции в данных. –

+0

Ну, задача загрузки не возобновляется, поэтому вы в конечном итоге выполните всю работу самостоятельно ... – matt

+0

Добавил в мой ответ упоминание о NSFileHandle; это может быть то, что вы ищете. – matt