2012-07-17 29 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取得了巨大成功:

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

(原谅格式; I”我将在以后格式化:-)

+0

Works 100%,我现在正在使用这个。谢谢。 – 2012-07-18 23:12:54

+5

'NSMapTable'也是一个选项。它的行为像一个'NSDictionary',但允许在其他选项之上对其键的弱引用。 – 2014-05-12 19:53:24

+0

我有一个简单的代码示例下面的'NSMapTable'。 – SmallChess 2016-10-11 08:17:08

4

完全脱离句子:“这不起作用,因为键在NSDictionary中复制。”你有没有在你的课堂课中尝试实施-isEqual:-hash?我敢打赌,如果将用于查找的课程和字典中复制的课程作为关键字进行比较,则评估结果为-isEqual:YES即可。

0

假设课程有一个唯一的编号(或标识符)使该密钥。使用一个NSMutableDictionary,你可以稍后更新字典,但是写一个更高值的新数字(如Lession更新),但是使用相同的密钥。

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