2012-03-18 103 views
1

在我的應用我有一樣的實體類得到數組對象:要根據病情

#import <Foundation/Foundation.h> 

@interface classAbc : NSObject 
{ 
    NSString *strTitle; 
    int iId; 


} 

@property(nonatomic, retain) NSString *strTitle; 
@property(nonatomic) int iId; 
@end 

,並在我的NSMutableArray我保存這個類的對象,如:

classAbc *objAbc=[[classAbc alloc] init]; 
objAbc.iId=1; 
[email protected]"Title 1"; 

classAbc *objAbc1=[[classAbc alloc] init]; 
objAbc1.iId=2; 
[email protected]"Title 2"; 

NSMutableArray *arrTemp=[[NSMutableArray alloc] initWithObjects:objAbc,objAbc1,nil]; 

[objAbc release]; 
[objAbc1 release]; 

現在運行時我想根據objAbc.iId條件從此數組中檢索Object,例如:

如果arrTemp包含的iId值爲2的對象爲例。

任何人都可以建議的方式,而不是循環迭代?由於數字對象可以增加循環將花費大量的時間來找到它。

在此先感謝。

+2

金恰恰相反,for循環是相當快的。除非你要循環100個物體,否則絕對不是問題。 – CodaFi 2012-03-18 07:35:23

回答

0

搜索後我得到了這個問題的答案。使用NSPredicate是這種情況的最佳方式。使用NSPredicate,我們可以對類對象的任何成員應用條件。

這是MAC OS X的鏈接,但是這適用於iPhone sdk並進行了一些更改。 NSPredicate

1

我建議你使用NSMutableDictionary來存儲你的對象,其中的關鍵是對象的ID和值是對象本身。如果您不介意訂單,請使用此方法。

classAbc *objAbc=[[classAbc alloc] init]; 
objAbc.iId=1; 
[email protected]"Title 1"; 

classAbc *objAbc1=[[classAbc alloc] init]; 
objAbc1.iId1=2; 
[email protected]"Title 2"; 


NSMutableDictionary *dict = [[NSMutableDictionary alloc] init]; 
[dict setObject:objAbc1 forKey:objAbc1.iId1]; 

. 
. 
. 

classAbc *abc = (classAbc*)[dict objectForKey:[NSNumber numberWithInt:2]]; 

注意:從int類型的變化ID輸入的NSNumber,所以你可以把它保存爲一個關鍵

+0

giorashc,感謝您的快速回復,但在這裏我剛剛給出了id的例子,匹配條件可以在任何對象的成員。所以我認爲這不會有幫助。 – 2012-03-18 07:55:37

+0

任何兩個對象都可以比較,所以我不明白爲什麼你不應該爲你的目的使用字典。自定義對象可以覆蓋用於自定義比較的'isEqual'和'hash'方法。 – giorashc 2012-03-18 08:16:58

+0

我不想比較兩個對象,我想根據該對象的任何成員上的條件找到單個對象。 – 2012-03-18 09:08:27

0

你可以在filteredArrayUsingPredicate KOOK:但說實話,這很可能只是在做快速列舉在後臺。

確保您的「for循環」實際上是一個快速列舉循環而不是用數組作爲循環整數的計數:

for (classAbc* obj in arrTemp) 
{ 
    // check for your match 
    break; // if found 
} 

只有嘗試一些更復雜的,如果這實際上給你衡量性能問題。

+0

jrturton,是的,我知道這一點。這是我最後的選擇,如果我沒有得到任何其他更快的迭代解決方案。 – 2012-03-18 07:58:13

1

使用predicateWithBlock:獲取特定屬性的對象。 NSPredicate Link

  • (NSPredicate *)predicateWithBlock:(BOOL(^)(ID evaluatedObject,NSDictionary的*綁定))塊