2012-07-17 46 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];