Iphone 从数组检索自定义对象时出现性能问题
我创建了一个自定义对象,它有一些属性,如ID和标题、描述等 我将它添加到一个数组中。(该数组可能包含500多个值) 我使用以下代码检索自定义对象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
-(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:
可以做任何比海报已经在做的线性搜索更聪明的事情吗?你分析代码了吗?它必须比原始版本慢。