2012-07-17 21 views
11

Tengo un montón de Lesson sy la clase funciona muy bien. Hay un controlador de vista que funciona con estas lecciones. Este controlador necesita saber el estado de carga de un lesson, por lo que tenemos un NSDictionary con la clave Lesson como y un NSNumber con el porcentaje del estado de carga.Usando un objeto como clave para NSDictionary

Esto es un problema porque después de insertar un Lesson que desea hacer una búsqueda más tarde en ese mismo Lesson (tal vez en cellForRowAtIndexPath:) para obtener el progreso. Esto no funciona porque las claves se copian en NSDictionary.

¿Es buena forma de ahorrar y coger claves con algo como esto:

NSNumber *key = [NSNumber numberWithUnsignedInt:[obj hash]]; 
[dict setObject:@"... upload progress" forKey:key]; 

O hay un mejor enfoque?

Respuesta

33

He utilizado esta técnica muchas veces en el pasado, y han tenido un gran éxito al envolver las claves-objetos en un NSValue:

NSValue *myKey = [NSValue valueWithNonretainedObject:anInstance]; 
id anItem =[myDict objectForKey:myKey]; 

https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/nsvalue_Class/Reference/Reference.html#//apple_ref/occ/clm/NSValue/valueWithNonretainedObject:

(valga el formato; I' m en iPhone. Formatearé más tarde :-)

+0

Funciona al 100%, ahora estoy usando esto. Gracias. –

+5

'NSMapTable' también es una opción. Se comporta como un 'NSDictionary' pero permite referencias débiles a sus claves sobre otras opciones. –

+0

Tengo un ejemplo de código simple para 'NSMapTable' a continuación. – SmallChess

4

Saliendo únicamente de la frase: "Esto no funciona porque las claves se copian en NSDictionary". ¿Has intentado implementar -isEqual: y -hash en tu clase de Lección? Estoy dispuesto a apostar que si la Lección que usas para la búsqueda y la copiada en el diccionario como clave evalúan -isEqual: a YES en comparación, estarás bien.

0

Suponiendo que la lección tiene un número único (o identificador), haga esa clave. Usando un NSMutableDictionary, luego puede actualizar el diccionario pero escribiendo un número nuevo con un valor más alto (como las actualizaciones de la sesión) pero con la misma clave.

0
UIView *view = [[UIView alloc] init];   
NSMapTable *dict = [NSMapTable weakToStrongObjectsMapTable]; 
[dict setObject:[NSNumber numberWithInt:1234] forKey:view]; 
NSNumber *x = [table objectForKey:view]; 
Cuestiones relacionadas