2015-10-13 77 views
0

什麼是IM DOING我正在嘗試獲取AVAudioRecorder上傳到我們後端的音頻文件(可能長達一小時,例如播客)。除了上傳到服務器,如果用戶選擇,它需要能夠被「暫停」和「恢復」。因此,我相信,我需要在NSData類上使用dataWithBytesNoCopy:buffer來實現此目的。從文件獲取字節數據

WHERE IM AT我知道一個事實,我可以使用傳遞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將被設計爲在用戶點擊包含上載停止的最後一個字節的「Resume」時發送給我們一個Header,然後我需要獲取這些信息並將其插入到'dataWithBytesNoCopy:buffer '從數據的正確位置開始再次上傳的方法。 –

+0

那麼,上傳任務是不可恢復的,所以你最終會自己完成所有的工作... – matt

+0

添加了NSFileHandle提到我的答案;這可能是你正在尋找的。 – matt