Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/114.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 根据条件从数组中获取对象_Ios_Nsmutablearray_Contains - Fatal编程技术网

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

Ios 根据条件从数组中获取对象,ios,nsmutablearray,contains,Ios,Nsmutablearray,Contains,在我的应用程序中,我有如下实体类: #import <Foundation/Foundation.h> @interface classAbc : NSObject { NSString *strTitle; int iId; } @property(nonatomic, retain) NSString *strTitle; @property(nonatomic) int iId; @end classAbc *objAbc=[[classAbc al

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

#import <Foundation/Foundation.h>

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


}

@property(nonatomic, retain)  NSString *strTitle;
@property(nonatomic) int iId;
@end
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条件从这个数组中检索对象,如下所示:

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

除了循环迭代之外,有谁能提出其他方法吗?随着循环对象数量的增加,查找循环将花费大量时间


提前感谢。

我建议您使用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]];

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

您可以使用predicate拒绝Filteredarray:但老实说,这可能只是在后台执行快速枚举

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

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

如果这确实会给您带来可衡量的性能问题,请尝试更复杂的方法

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

这是MAC OS X的链接,但在iPhone sdk上可以使用,但需要做一些更改。

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

  • (NSPredicate*)谓词WithBlock:(BOOL(^)(id evaluatedObject,NSDictionary*绑定))块

相反,因为循环速度非常快。除非你要循环遍历100个对象,否则这绝对不是问题。giorashc,谢谢你的快速回复,但这里我刚刚给出了id的示例,匹配条件可以在对象的任何成员上。所以我不认为这会有帮助。任何两个对象都可以比较,所以我不明白为什么你不应该使用字典。自定义对象可以覆盖用于自定义比较的
isEqual
hash
方法。我不想比较两个对象,我想根据该对象任何成员的条件找到一个对象。你能为你所说的“该对象任何成员的条件”伪编码一个示例吗?jrturton,是的,我知道这一点。这是我最后的选择,如果我没有得到任何其他更快迭代的解决方案。