0

미디어 선택 도구로 만든 노래의 재생 목록을 저장하려고합니다. Persist a MPMediaItemCollection Object Using NSUserDefaults에 제공된 제안을 사용하려고했습니다.NSKeyedArchiver가 MPMediaItemCollection 개체를 제대로 저장하지 못하는 것 같습니다.

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:mediaItemCollection]; 

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
[defaults setObject:data forKey:@"someKey"]; 
[defaults synchronize]; 

을 그런 다음 MPMediaItemCollection 다음이 수행, 검색 할 필요가있을 때 :

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
NSData *data = [defaults objectForKey:@"someKey"]; 
MPMediaItemCollection *mediaItemCollection = [NSKeyedUnarchiver unarchiveObjectWithData:data]; 

이 있지만 처음 일 듯 나는 그것을하지 않는 것을 발견, 다음과 같이이 솔루션은 NSKeyedArchiver를 사용 시간이 지남에 따라 일관되게 작업하십시오. 새로운 소프트웨어가 출시 된 후 내 앱이로드 된 후 재생 목록의 일부 미디어 항목이 손상된 것처럼 보입니다. 내가있는 tableView에 표시하기 위해 검색 MPMediaItemCollection에서 노래 제목을로드 할 때 예를 들어, 다음과 같이

MPMediaItem *anItem = (MPMediaItem *)[mediaItemCollection.items objectAtIndex: row]; 

if (anItem) { 
    cell.textLabel.text = [anItem valueForProperty:MPMediaItemPropertyTitle]; 

    if (cell.textLabel.text == nil) { 
     NSString * persistentID = [anItem valueForProperty:MPMediaItemPropertyPersistentID]; 
     ... 
} 

노래 제목은 항목 중 일부에 대한 무기 호입니다. 큐의이 인덱스에있는 노래의 persistentID를 가져 오려고하면 persistentID가 있지만 올바른 노래를 가리 키지 않습니다 (아마도 가비지 일 것입니다).

질문 : MPMediaItemCollection을 저장하면 모든 출시 및 소프트웨어 업그레이드 (업그레이드 및 iOS 업그레이드 모두)에서 유효하다는 것을 확인할 수 있습니까? 그렇다면 어떻게?

답변

0

대답은 이렇게되지 않습니다! MPMediaItemCollection 객체는 NSArray, NSDictionary 또는 NSUserDefaults에서 보관할 수있는 다른 객체로 변환 될 수 없습니다.

제 제안은 컬렉션을 통해 열거하고 [anItem valueForProperty:MPMediaItemPropertyPersistentID]의 배열을 저장하는 것입니다. NSUserDefaults

다음에 다음 응용 프로그램을 실행할 때 NSArray를 읽고 열거하고 persistentID가있는 항목을 사용하여 MPMediaItemCollection을 다시 만듭니다.

도움이 되었기를 바랍니다.

+0

감사합니다. http://stackoverflow.com/questions/5702707/play-ipod-playlist-retrieved-from-a-saved-persistentid-list에 대한 링크가 필요한 구현을 제공한다고 생각합니다. 괴롭히는 유일한 사실은 persistentID에 대한 Apple의 의견입니다. "이 값은 동기화/비동기/동기화주기에서 지속될 수 있다고 보장하지 않습니다." 그게 무슨 뜻인지 아십니까? – JeffB6688

+0

확실합니다. 사용자가 장치에서 트랙을 동기화 해제 한 다음 동일한 트랙을 다시 동기화하면 동일한 음악에 대해 ID가 변경되고 이는 정상입니다. 동기화 중에 보관 가능한 음악 배열을 저장하려면 userdefaults에 persistentID 대신 @ { "trackName": @ "", @ "artistName": @ ""} 사전 배열을 저장하고 노래를 쿼리 할 수 ​​있습니다 앱을 실행하는 eveytime. 하지만 노래 수가 많으면 비용이 많이 들기 때문에 추천하지 않습니다. – Shahin