根据条件从数组中获取对象

时间:2012-03-18 07:33:30

标签: ios nsmutablearray contains

在我的应用程序中,我有实体类,如:

#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;
objAbc.strTitle=@"Title 1";

classAbc *objAbc1=[[classAbc alloc] init];
objAbc1.iId=2;
objAbc1.strTitle=@"Title 2";

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

[objAbc release];
[objAbc1 release];

现在运行时我想根据objAbc.iId条件从这个数组中检索Object,如:

如果arrTemp包含的对象的iId值为2,例如。

除了循环迭代之外,任何人都可以建议吗?由于数字对象可以增加循环,因此需要花费大量时间才能找到它。

提前致谢。

4 个答案:

答案 0 :(得分:1)

我建议您使用NSMutableDictionary存储您的对象,其中键是对象的id,值是对象本身。如果你不介意订单使用这种方法。

classAbc *objAbc=[[classAbc alloc] init];
objAbc.iId=1;
objAbc.strTitle=@"Title 1";

classAbc *objAbc1=[[classAbc alloc] init];
objAbc1.iId1=2;
objAbc1.strTitle1=@"Title 2";


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

.
.
.

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

注意:将类型从int更改为类型NSNumber,以便将其存储为键

答案 1 :(得分:1)

使用predicateWithBlock:获取特定属性的对象。 NSPredicate Link

  • (NSPredicate *)predicateWithBlock :( BOOL(^)(id evaluateObject,NSDictionary * bindings))block

答案 2 :(得分:0)

你可以解决filterArrayUsingPredicate:但说实话,这可能只是在后台进行快速枚举。

确保“for循环”实际上是一个快速枚举循环,而不是将数组的计数用作循环整数:

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

如果这实际上会给您带来可衡量的性能问题,那么只能尝试更复杂的东西。

答案 3 :(得分:0)

搜索后,我得到了这个问题的答案。使用NSPredicate是这种情况的最佳方式。使用NSPredicate,我们可以对类对象的任何成员应用条件。

这是MAC OS X的链接,但这适用于iPhone sdk并进行了一些更改。 NSPredicate