2012-07-17 7 views
11

나는 Lesson의 무리를 가지고 있으며 클래스는 훌륭하게 작동합니다. 이 레슨과 함께 작동하는보기 컨트롤러가 있습니다. 이 컨트롤러는 lesson의 업로드 상태를 알고 있어야하므로 Lesson을 NSDictionary로, NSNumber을 업로드 상태로 표시합니다.개체를 NSDictionary의 키로 사용합니다.

Lesson을 삽입 한 후에 나중에 Lesson (아마도 cellForRowAtIndexPath:)에 대한 조회를 수행하여 진행 상황을 확인하기 때문에 문제가됩니다. NSDictionary에서 키가 복사되기 때문에이 작업이 수행되지 않습니다.

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

또는 거기에 더 나은 방법 :

는이 같은 뭔가 키를 저장하고 가져 오기 좋은 형태인가?

답변

33

:

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 :

이 (서식을 용서, 나는 ' iPhone에서 m. 나중에 포맷하겠습니다 :-)

+0

작품 100 %, 지금 사용 중입니다. 고맙습니다. –

+5

NSMapTable도 옵션입니다. 그것은'NSDictionary'처럼 행동하지만 다른 옵션들 위에 그것의 키에 대한 약한 참조를 허락합니다. –

+0

아래 'NSMapTable'에 대한 간단한 코드 샘플이 있습니다. – SmallChess

4

"NSDictionary에서 키가 복사되기 때문에이 작업이 수행되지 않습니다." Lesson 수업에 -isEqual:-hash을 구현해 보셨습니까? 나는 레슨을 검색에 사용하고 사전에 복사 한 키를 키로 사용하면 -isEqual:에서 YES까지를 비교해도 괜찮을 것입니다.

0

수업에 고유 번호 (또는 식별자)가 있다고 가정하면 해당 키가됩니다. NSMutableDictionary를 사용하면 나중에 사전을 업데이트 할 수 있지만 더 높은 값 (Lession 업데이트와 같은)이지만 동일한 키가있는 새 번호를 작성합니다.

내가 과거에이 기술을 여러 번 사용하고, 그리고 NSValue에 키 객체를 래핑하여 큰 성공을 있었다
0
UIView *view = [[UIView alloc] init];   
NSMapTable *dict = [NSMapTable weakToStrongObjectsMapTable]; 
[dict setObject:[NSNumber numberWithInt:1234] forKey:view]; 
NSNumber *x = [table objectForKey:view]; 
관련 문제