Получение байтовых данных из файла

ЧТО Я ДЕЛАЮ Я пытаюсь получить аудиофайл (длиной до часа, например, подкаст), который я записал с помощью 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];

person Brandon A    schedule 13.10.2015    source источник


Ответы (1)


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

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

person matt    schedule 13.10.2015
comment
Спасибо за ответ. Но наша команда явно хочет, чтобы кнопка «Пауза» остановила загрузку, а кнопка «Возобновить» снова начала загрузку с того места, где файл был остановлен. Таким образом, наш API будет разработан для отправки нам обратно заголовка, как только пользователь нажмет «Возобновить», который будет содержать последний байт, на котором остановилась загрузка, затем мне нужно будет взять эту информацию и подключить ее к методу dataWithBytesNoCopy:buffer, чтобы снова начать загрузку. с правой позиции в данных. - person Brandon A; 13.10.2015
comment
Что ж, задачу загрузки нельзя возобновить, так что в конечном итоге вы будете выполнять всю работу самостоятельно... - person matt; 13.10.2015
comment
В мой ответ добавлено упоминание о NSFileHandle; это может быть то, что вы ищете. - person matt; 13.10.2015
comment
Спасибо, Мэтт. Со временем я посмотрю на это и сообщу, работает это или нет. - person Brandon A; 14.10.2015
comment
Что ж, с момента публикации этого поста прошло уже больше года. Я считаю, что мы полностью отказались от функции резюме. Но за то, что ты классный, ты получаешь галочку. - person Brandon A; 25.01.2017