我有工作代码,并且希望从中获得更好的性能,因为如果传递更多数据,它会变得很有用。但我不知道我还能做些什么。
输入:带有logUnits的数组,每个包含一个日志事件视图,如“2013-01-16 15:13:00 Hello”和一些次数 - 这个数组只包含我们有日志事件的时间(2013-01- 02,2013-01-09等)
输出:视图数组,其中每个视图包含同一天的日志单位。
我也可能需要按事件类型过滤日志单位。
我是这样做的。
NSMutableArray *views = [[NSMutableArray alloc] initWithCapacity:times.count];
@autoreleasepool {
for(int x = 0; x != times.count; x++)
{
UIView *foo = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 400)];
foo.backgroundColor = [UIColor clearColor];
int f = 0;
int h = 0;
for(int i = 0; i != objectArray.count; i++)
{
@autoreleasepool
{
LogUnit *unit = [objectArray objectAtIndex:i];
if([[times objectAtIndex:x] isEqual:[unit realTime]])
{
if(![[foo subviews] containsObject:unit.view]) // Look if unit was already added
{
NSString *number = [NSString stringWithFormat:@"SortLog%i ",[[NSUserDefaults standardUserDefaults] stringForKey:@"ObjectNumber"].intValue];
NSString *comp = [[NSUserDefaults standardUserDefaults] stringForKey:number];
if([[unit status] isEqualToString:comp] || [comp isEqualToString:NULL] || comp == NULL)
{
if([unit getEvent] != NULL)
{
unit.view.frame = CGRectMake(unit.view.frame.origin.x, f * unit.view.frame.size.height + 30, unit.view.frame.size.width, unit.view.frame.size.height);
[foo addSubview:unit.view];
f++;
h = unit.view.frame.size.height * f;
}
}
}
}
}
}
foo.frame = CGRectMake(0,0, 320, h + 30 );
h = 0;
[views addObject:foo];
}
我猜这里最糟糕的是循环中的循环,对于每个外循环,我必须重新运行所有的logUnit。但不知道我怎么能做到这一点。也许有一种方法可以称之为“选择单位,时间等于[单位实时]”任何想法?
答案 0 :(得分:0)
这里有几个红旗。最低级的成果是你正在扫描unit.view的foo的所有子视图,这是一个O(n)操作,它在最里面的循环中真的受到了伤害。
接下来,如果按时间对两个数组进行排序,则实际上不必执行双循环来查找大小相同的事件。了解如何在合并排序中完成。
如果仍然不够好,可以考虑在侧线程上进行所有比较工作,并且只将add子视图和视图创建过程分派回主线程。它至少会让它看起来更快。