Iphone 从数组检索自定义对象时出现性能问题

Iphone 从数组检索自定义对象时出现性能问题,iphone,objective-c,ios,performance,ipad,Iphone,Objective C,Ios,Performance,Ipad,我创建了一个自定义对象,它有一些属性,如ID和标题、描述等 我将它添加到一个数组中。(该数组可能包含500多个值) 我使用以下代码检索自定义对象 -(CustomObjects *)getObjectWithId:(int)id { CustomObjects *objCustomObjects = nil; for (CustomObjects *customObjects in arrayCustomObjects) { if (customOb

我创建了一个自定义对象,它有一些属性,如ID和标题、描述等

我将它添加到一个数组中。(该数组可能包含500多个值)

我使用以下代码检索自定义对象

-(CustomObjects *)getObjectWithId:(int)id    {

    CustomObjects *objCustomObjects = nil;

    for (CustomObjects *customObjects in arrayCustomObjects)  {

        if (customObjects.id == id) {

            objCustomObjects = customObjects;
            break;
        }
    }


    return objCustomObjects;
}
但是它有一些性能问题,因为我使用该函数调用UIScrollview

如何提高获取对象的性能?


提前感谢,

您可以使用
NSDictionary
id
作为键。您可以很容易地从字典中获取对象


符合您的要求吗?

您可以使用NSPredicate检查
id
是否等于您要查找的对象,并通过调用
filteredArrayUsingPredicate:
使用此谓词简单地过滤自定义对象

为了提高性能,我不直接调用在滚动视图中执行繁重工作的函数,而是调用
[self-performSelector:…withObject:nil afterDelay:0],尝试推迟您试图计算的内容将计算推迟到下一个运行循环。如果在调用PerformSelect之前检查是否已经安排了计算,则实际上应该能够在保持清晰界面的同时降低计算频率。

使用NSPredicate:-

您将收到带有已传递id的对象的过滤数组

NSPredicate*谓词=[NSPredicate谓词格式:@“id==%@”,id]


NSArray*filtered=[arrayCustomObjects filteredArrayUsingPredicate:predicate]

一本字典更好。唯一需要注意的是,不能使用带有原始
int
键的
NSDictionary
,因此必须将
id
包装在
NSNumber

- (void) addCustomObject: (CustomObject*) obj {
    NSNumber *wrappedID = [NSNumber numberWithInt:[obj idNumber]];
    [dictionary setObject:obj forKey:wrappedID];
}

- (CustomObject*) findObjectByID: (int) idNumber {
    NSNumber *wrappedID = [NSNumber numberWithInt:[obj idNumber]];
    return [dictionary objectForKey:wrappedID];
}

字典(也称为)不必遍历所有的值才能找到正确的值,它将所有的值按照键巧妙地排列,以便可以跳转到正确的值或靠近它。你对数组所做的是调用它,它不是很有效。

如果你想快速查找,你必须放弃数组而选择字典

如果要同时通过键和索引访问对象,则需要将对象分为两个集合,并确保它们同步

我已经为这个名为
CWOrderedDictionary
的文件创建了一个助手类。它是
NSMutableDictionary
的一个子类,允许通过两个键访问对象(就像任何字典一样),并使用与
NSMutableArray
相同的方法通过索引访问对象


我的课程可以用来激发灵感,或者从这里开始:

我对给定的代码做了一些更改,而不是
int
只需使用
[NSNumber numberwhithint:

-(CustomObjects *)getObjectWithId:(NSNumber* )id    {//changed int to NSNumber

    CustomObjects *objCustomObjects = nil;

    NSPredicate *bPredicate = [NSPredicate predicateWithFormat:@"SELF.id==%@",id];
    NSArray *result = [array filteredArrayUsingPredicate:bPredicate];
//return filtered array contains the object of your given value

    if([result count]>0)
        objCustomObjects = [result objectAtIndex:0];

    }
    return objCustomObjects;
}

我希望您没有实际使用
id
作为方法的参数-它是Objective-C中的保留字…:)谓词真的不能做任何比他已经在做的线性搜索更聪明的事情,是吗?再一次,你觉得
filteredarrayingpredicate:
可以做任何比海报已经在做的线性搜索更聪明的事情吗?你分析代码了吗?它必须比原始版本慢。