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

时间:2011-08-05 07:34:52

标签: iphone objective-c ios performance ipad

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

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

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

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

    CustomObjects *objCustomObjects = nil;

    for (CustomObjects *customObjects in arrayCustomObjects)  {

        if (customObjects.id == id) {

            objCustomObjects = customObjects;
            break;
        }
    }


    return objCustomObjects;
}

但它有一些性能问题,因为我使用该函数调用UIScrollview捏。

如何提高获取对象的效果?

提前感谢,

6 个答案:

答案 0 :(得分:1)

字典对此更好。唯一的问题是,您不能拥有NSDictionary原始int键,因此您必须将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];
}

字典(也称为hash table)不必遍历所有值来找到正确的值,它根据键巧妙地排列所有值,以便它可以跳转到右边或者接近它。您对数组所做的事情称为linear search,效率不高。

答案 1 :(得分:0)

最好使用NSDictionary作为关键字id。您可以轻松地从字典中获取对象。

你的要求可以吗?

答案 2 :(得分:0)

您可以使用NSPredicate来检查id是否等于您要查找的那个,只需通过调用filteredArrayUsingPredicate:使用此谓词过滤自定义对象。

为了提高性能,我会尝试推迟你想要计算的任何东西,不要直接调用在滚动视图中执行繁重工作的函数,而是调用[self performSelector:... withObject:nil afterDelay:0];将计算推迟到下一个runloop循环。如果在调用performSelector之前检查是否已经安排了计算,那么实际上应该能够在保持清晰界面的同时降低计算频率。

答案 3 :(得分:0)

如果你想快速查找,你必须抛弃数组以支持字典。

如果你想通过键和索引访问对象,那么你需要两个集合中的对象,并确保它们是同步的。

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

我的班级可以用于灵感,或者从这里开始:https://github.com/jayway/CWFoundation/

答案 4 :(得分:-1)

使用NSPredicate: -

您将收到带有您传递的ID的对象的过滤数组;

NSPredicate * predicate = [NSPredicate predicateWithFormat:@“id ==%@”,id];

NSArray * filtered = [arrayCustomObjects filteredArrayUsingPredicate:predicate];

答案 5 :(得分:-1)

而不是int只使用[NSNumber numberWithInt:],我在您的代码中做了一些更改。

-(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;
}