私はそのような方法を持っており、より適切に実行するために最適化するのに苦労しています。NSLog(@"Debug2")
と の間を移動するのに、100 単位で約 1 秒、4 回かかりますNSLog(@"Debug3")
。iPhoneなら2秒。より多くのユニットでは、より多くの時間がかかります。250 ユニットで 5 倍、Mac では 1.7 秒、iPhone では 3.2 秒かかります。
パフォーマンスはサイクル内のサイクルにあるとは思いません。250 * 5 = 1250 であるため、コンピューターが高速に処理するには大きすぎないはずです。
方法のアイデア:
入力: NSMutableArray times - 時刻 (2012-12-12、2013-01-19) などを含む NSMutableArray objectArray -LogUnit
オブジェクトを含む。出力: 計算されたビューの配列。
主なアイデア: 時間が同じである ObjectArray からのオブジェクトを使用した各時間のビュー。
一部のオブジェクトを表示することで高速化しましたが (counted
コード内_breakPlease
の および を参照)、まだ十分な速度ではありません。
- (NSMutableArray*) sortViews: (NSMutableArray *)times and:(NSMutableArray *)objectArray
{
NSLog(@"debug2");
NSMutableArray *views = [[NSMutableArray alloc] initWithCapacity:times.count];
NSString *number = [NSString stringWithFormat:@"SortLog%i ",[[NSUserDefaults standardUserDefaults] stringForKey:@"ObjectNumber"].intValue];
NSString *comp = [[NSUserDefaults standardUserDefaults] stringForKey:number];
LogUnit *unit;
int counted = 0;
for(int x = 0; x != times.count; x++)
{
@autoreleasepool {
UIView *foo = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 400)];
foo.backgroundColor = [UIColor clearColor];
int f = 0;
int h = 0;
NSString *attributeName = @"realTime";
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K IN %@", attributeName, [times objectAtIndex:x]];
// Filter the objectArray by the time, so we don't have to run through all the objects in objectArray, and check if time is right.
NSArray *filtered = [objectArray filteredArrayUsingPredicate:predicate];
for(int i = 0; i != filtered.count; i++)
{
unit = [filtered objectAtIndex:i];
// Filter units by user choice (comp). Like comp = Warnings or comp = Errors and etc.
if([[unit status] isEqualToString:comp] || [comp isEqualToString:NULL] || comp == NULL)
{
// testing if the unit is correct to use
if([unit getEvent] != NULL)
{
// below is some computation for frames, to get them to proper position
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];
counted++;
f++;
h = unit.view.frame.size.height * f;
}
}
}
UILabel *myLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 320, 30)];
myLabel.backgroundColor = [UIColor clearColor];
myLabel.font = [UIFont boldSystemFontOfSize:20];
myLabel.textColor = [UIColor colorWithRed:88 green:154 blue:251 alpha:1];
myLabel.textAlignment = UITextAlignmentCenter;
myLabel.text = [times objectAtIndex:x];
// Just adding a label with "2012-12-30" or etc on top of the view.
[foo addSubview:myLabel];
foo.frame = CGRectMake(0,0, 320, h + 30 );
h = 0;
[views addObject:foo];
// counting added views for performance, if more than 30, return, and show only small portion of whole units, user has the option to show all the units if he wants to, but that takes a time to load..
if(counted > 30 && filtered.count != counted)
{
if(_breakPlease == false)
{
_broken = true;
break;
}
}
}
}
NSLog(@"debug3");
return views;
}