2011-12-04 10 views
10

Específicamente, este problema se me ocurre cuando realizo una solicitud con AFNeworking con JSONkit y recibo un JSON (id) con varias matrices y diccionarios anidados.¿Cuál es el mejor enfoque para convertir objetos inmutables en objetos mutables (recursivos)?

Si no quiero modificar los datos, no tendrá ningún problema:

self.myNSArray = [JSON objectForKey:@"result"];

Pero si quiero modificar los datos que tengo para almacenarlo en una variable mutable:

self.myNSMutableArray = [[JSON objectForKey:@"result"] mutableCopy];

El último no convierte matrices anidadas o diccionarios de datos mutables; funciona solo para el primer nivel.

La única forma que he encontrado es en este enlace recursive mutable objects; pero no sé si hay una mejor manera de resolver este tipo de problema.

Gracias de antemano.

Respuesta

11

Se puede usar la función CoreFoundation CFPropertyListCreateDeepCopy con la opción mutabilidad kCFPropertyListMutableContainersAndLeaves:

NSArray *immutableArray = [JSON objectForKey:@"result"]; 
self.myMutableArray = [(NSMutableArray *)CFPropertyListCreateDeepCopy(NULL, immutableArray, kCFPropertyListMutableContainersAndLeaves) autorelease]; 
+0

Funciona a las mil maravillas. ¡Gracias! – martinezdelariva

+2

El equivalente de ARC parece ser 'CFBridgingRelease (CFPropertyListCreateDeepCopy (NULL, (__bridge CFPropertyListRef) (immutableArray), kCFPropertyListMutableContainersAndLeaves));' – brainjam

+1

@omz Si esto funciona para los diccionarios, ¿lo sabías? Parece que no puede convertirlo. –

5

En ARC:

CFBridgingRelease(CFPropertyListCreateDeepCopy(NULL, (__bridge CFPropertyListRef)(immutableArray), kCFPropertyListMutableContainersAndLeaves)) 

realmente funcionó. Gracias brainjam.

+0

Parece que me funciona. ¡Gracias! – cbh2000

0

Asegúrate de tener en cuenta los valores de null en la cadena de respuesta, de lo contrario, no te devuelve nada, lo que causa resultados horribles.

(para, por ejemplo. Trate respuesta mutataing de http://www.json-generator.com/api/json/get/bQVoMjeJOW?indent=1)

lugar justo debajo de la línea cuando la conversión de respuesta de la API de JSON objeto.

responseString=[responseString stringByReplacingOccurrencesOfString:@"\":null" withString:@"\":\"\""];//To Handle Null Characters 

//Search for below line in your parsing library and paste above code 
data = [responseString dataUsingEncoding:NSUTF8StringEncoding]; 

Por lo tanto no habrá caracteres nulos en su objeto JSON, por lo tanto, no hay problema con el uso CFPropertyListCreateDeepCopy.

¡Salud!

Cuestiones relacionadas