我创建了一个自定义对象,它有一些属性,如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捏。
如何提高获取对象的效果?
提前感谢,
答案 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;
}