使用对象作为NSDictionary的键

时间:2012-07-17 23:31:51

标签: iphone objective-c ios

我有一堆Lesson,这个课程很棒。有一个视图控制器可以使用这些课程。此控制器需要知道lesson的上传状态,因此我们有一个NSDictionary,其中Lesson为关键,NSNumber为上传状态的百分比。

这是一个问题,因为在您插入Lesson之后,您希望稍后对同一Lesson(可能在cellForRowAtIndexPath:)进行查找以获得进度。这不起作用,因为密钥是在NSDictionary中复制的。

用这样的东西保存和获取密钥是不错的形式:

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

还是有更好的方法?

4 个答案:

答案 0 :(得分:37)

我过去曾经多次使用过这种技术,并且通过将关键对象包装到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

(原谅格式化;我在iPhone上。我稍后会格式化: - )

答案 1 :(得分:4)

完全不使用句子:“这不起作用,因为密钥是在NSDictionary中复制的。”您是否尝试在课程课程中实施-isEqual:-hash?我愿意打赌,如果用于查找的课程和字典中复制的课程作为关键字进行比较时评估-isEqual:YES,那么你会没事的。

答案 2 :(得分:4)

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

答案 3 :(得分:0)

假设课程有唯一的编号(或标识符),那就是关键。使用NSMutableDictionary,您可以稍后更新字典,但是写一个具有更高值的新数字(作为Lession更新)但是使用相同的键。