14

我有一堆Lessons,而且课程效果很好。有一个视图控制器可以处理这些课程。这个控制器需要知道 a 的上传状态,lesson所以我们有一个 NSDictionary,它带有Lessonas 键和一个NSNumber上传状态的百分比。

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

使用以下方式保存和获取密钥是否是一种好方法:

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

还是有更好的方法?

4

4 回答 4

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 上。稍后我会格式化 :-)

于 2012-07-17T23:55:42.193 回答
5

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

于 2012-07-17T23:49:06.650 回答
5
UIView *view = [[UIView alloc] init];           
NSMapTable *dict = [NSMapTable weakToStrongObjectsMapTable];
[dict setObject:[NSNumber numberWithInt:1234] forKey:view];
NSNumber *x = [table objectForKey:view];
于 2016-10-11T08:15:41.210 回答
0

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

于 2012-07-17T23:55:38.910 回答