2011-01-18 13 views
5

estoy bucle a través de todas las canciones de la biblioteca de música de un iPhone usando el siguiente código:NSNumber para MPMediaItemPropertyPersistentID a NSString y viceversa

NSArray * songs = [[NSArray alloc] initWithArray:[[MPMediaQuery songsQuery] collections]]; 

for (MPMediaItemCollection * item in songs){ 

    NSString * persistentID = [[[item representativeItem] valueForProperty:MPMediaItemPropertyPersistentID] stringValue]; 
    // Do something with it. 
} 

[songs release]; 

Cosas bastante básico.

Obtengo el PersistentID como NSString porque necesito escribirlo en un archivo XML (para la transmisión a través de una red a otro dispositivo). De ahí la razón por la que no puedo simplemente dejarlo como NSNumber.

El otro dispositivo solicitará que el iPhone reproduzca una pista transmitiendo el PersistentID de nuevo.

En este punto, el iPhone tiene un NSString del PersistentID de la pista que debería reproducirse.

Sería combos repetir todas las canciones y comparar PersistentID hasta encontrar la pista que quiero, así que estoy tratando de usar el MPMediaPropertyPredicate para que el iPhone me busque.

estoy usando el siguiente código para la búsqueda:

MPMediaPropertyPredicate * predicate = [MPMediaPropertyPredicate predicateWithValue:persistentID forProperty:MPMediaItemPropertyPersistentID]; 

MPMediaQuery * songsQuery = [[MPMediaQuery alloc] init]; 
[songsQuery addFilterPredicate:predicate]; 

if ([[songsQuery items] count]){ 

    MPMediaItem * item = [[songsQuery items] objectAtIndex:0]; 
    // Play item. 
} 

[songsQuery release]; 

Dónde persistentID es el NSString de antes.

Curiosamente, esto funciona para algunas canciones, no para otras. es decir, a veces la matriz items no está vacía, aunque estoy pasando un NSString, no un NSNumber.

Me pregunto si hay una forma de convertir mi NSString de vuelta al NSNumber de donde vino, y cómo puedo hacer eso.

ACTUALIZACIÓN: He probado el NSNumberFormatter, también he intentado algo así como:

[NSNumber numberWithFloat:[persID floatValue]]; 

He intentado todas las formas estándar de hacerlo sin prevalecer.

Respuesta

15

Esto está funcionando bastante bien, no hay problemas hasta ahora:

unsigned long long ullvalue = strtoull([persistentID UTF8String], NULL, 0); 
NSNumber * numberID = [[NSNumber alloc] initWithUnsignedLongLong:ullvalue]; 

MPMediaPropertyPredicate * predicate = [MPMediaPropertyPredicate predicateWithValue:numberID forProperty:MPMediaItemPropertyPersistentID]; 
[numberID release]; 

// And so on. 

Esperanza esto ayuda a cualquier otra persona que se encontró con este problema.

+0

+1 para la solución. Sin convertir a NSNumber intenté ingresar NSString al predicado y devolver 0 ítems. más de medio día ha intentado depurar. Tu solución ayudó. Gracias. – jkr

+0

solución Pro. ¡Gracias! – jarryd

0

Si lo entiendo correctamente, está tratando de convertir un NSString en un NSNumber. Para hacer esto, puede usar un NSNumberFormatter. Eche un vistazo al método numberFromString:.

NSNumberFormatter Class Reference

+0

He editar mi pregunta para incluir lo que he tratado. El formateador de números fue uno de ellos. –

0

Solo tenía que hacer lo mismo. El predicado de consulta para MPMediaItemPropertyPersistentID se debe pasar como NSNumber. He encontrado esta respuesta en la conversión de NSString a NSNumber de otro post StackOverflow:

NSNumberFormatter * f = [[NSNumberFormatter alloc] init]; 
[f setNumberStyle:NSNumberFormatterDecimalStyle]; 
NSNumber * persistentIDasNumber = [f numberFromString:persistantID]; 
[f release]; 

MPMediaPropertyPredicate * predicate = [MPMediaPropertyPredicate predicateWithValue:persistentIDasNumber forProperty:MPMediaItemPropertyPersistentID]; 

Esto funcionó para mí.

0

me encontré con algo muy similar y trabajaron el siguiente:

NSNumber *musicIdentifier = [[[NSNumberFormatter alloc] init] numberFromString: persistentID]; 
MPMediaQuery *query = [[MPMediaQuery alloc] initWithFilterPredicates:[NSSet setWithObject:[MPMediaPropertyPredicate predicateWithValue:musicIdentifier forProperty:MPMediaItemPropertyPersistentID]]]; 

MPMediaItem *item = query.items.firstObject;