2012-04-15 120 views
1

我正在從服務器下載幾個小尺寸歌曲並將其存儲(NSData)到NSUserDefaults中,以便我可以在需要時使用它緩存並直接在設備上播放,而不是下載並從服務器再次播放。 問題是,如果我在NSUserDefaults中存儲少量幾個較小尺寸的歌曲作爲數據格式,則會減少大量設備內存並引發內存警告或崩潰等。iPhone:在NSUserDefaults和內存問題上存儲音頻數據

難道你有人指導我如何解決它?如何將歌曲數據持久存儲在設備上以實現緩存目的,並且同時以較少的內存使用量進行存儲?

更新:根據建議,我試圖將歌曲數據添加到字典作爲文件,並試圖檢索它如下。但是,仍然面臨着同樣的問題,大約30mb的數據檢索後的內存警告。有人可以幫我解決這個問題嗎?我需要存儲大約40 mb的歌曲數據並存儲它。

NSURL *songurl = [NSURL URLWithString:downloadSOngUrl]; 
      NSMutableData *songdata = [NSMutableData dataWithContentsOfURL:songurl]; 

NSString *fileName = [downloadSOngUrl lastPathComponent]; 
      NSLog(@"fileName: %@",fileName); 

      [appDelegate writeSongIntoDocsDirectory :songdata :fileName]; 

-(void) writeSongIntoDocsDirectory :(NSData *) inSongData :(NSString *) songNamePath 
{ 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 

    NSLog(@"songNamePath: %@", songNamePath); 

    songNamePath = [songNamePath stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet] ]; 
    NSLog(@"songNamePath: %@", songNamePath); 

    if ([inSongData writeToFile:[documentsDirectory stringByAppendingPathComponent:songNamePath] atomically:YES]) 
    { 
     // Success ! 
     NSLog(@"Successfully saved the song into documents directory"); 

    } 
    else 
    { 
     // Error ! 
     NSLog(@"Error when Successfully saving song into documents directory"); 
    } 
} 
-(NSData *) readSongDataFromDocsDirectory :(NSString *) filePath 
{ 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 

    NSData *readData = [NSData dataWithContentsOfFile:[documentsDirectory stringByAppendingPathComponent:filePath]]; 

    return readData; 
} 

在此先感謝!

回答

0

更好地將這些音頻文件存儲在文檔目錄中,因爲這會減小應用程序的大小,NSUserDefaults通常用於存儲在特定於應用程序的小設置中,例如應用程序的特定用戶的首選項和所有設置。希望這有助於。 。 :)

無論你在存儲NSUserDefaults的將增加應用程序的大小,因爲這對象始終是活着,而應用程序運行

...

+0

您好,感謝您的答覆。你如何說存儲音頻文件?我的意思是,什麼格式?你想讓我把每首歌的NSData存儲在文檔目錄中嗎?因爲我的歌曲網址來自服務器,我使用NSData * data = [NSData dataWithContentsOfURL:url];現在獲取歌曲二進制文件。 – Getsy 2012-04-15 11:09:12

+0

NSData有一個名爲writeToFile的方法:atomically:它完全符合你想要做的。查看NSData的文檔以瞭解如何使用它。 – 2012-04-15 11:17:30

+0

嗨,我添加並存儲到文件目錄中大約70 mb的歌曲數據,但是當我嘗試使用NSUserDefaults時,問題也是如此。 – Getsy 2012-04-15 16:24:52