Dav*_*deC 0 performance for-loop objective-c nsarray ios
我有一个循环通过相当大量的对象的foor循环(目前4000以上,但可能是双倍增长.
我试图加快循环,我能够使用autoreleasepool释放内存并避免应用程序崩溃但是就速度而言,周期很慢.
有人建议我使用有序数组,但我对编程很陌生,所以我有点迷失.有人可以分享一些方向吗?
"Sede"中的对象具有渐进ID
这是我的代码:
NSArray *sedi = [Sede sedeArray];
for (Sede *sedeTmp in sedi)
{
@autoreleasepool {
if (sedeTmp.idSede == idSede)
{
sede = sedeTmp;
break;
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的完整代码:
+ (void)importData:(NSDictionary *)data
{
NSArray *info = data[@"Info"];
if (info != (id)[NSNull null])
{
}
NSMutableArray *utenti = [NSMutableArray arrayWithArray:[Utente utenteArray]];
NSMutableArray *utentiNew = [[NSMutableArray alloc] init];
for (NSDictionary *utenteWS in data[@"Utenti"])
{
NSInteger stato = [(NSNumber *)[NSString decrypt:utenteWS[@"Stato"]] integerValue];
NSInteger idUtente = [(NSNumber *)[NSString decrypt:utenteWS[@"IDUtente"]] integerValue];
Utente *utente = nil;
for (Utente *utenteTmp in utenti)
{
if (utenteTmp.idUtente == idUtente)
{
utente = utenteTmp;
break;
}
}
if (stato == 2) //DELETE
{
if (utente)
{
[self setUtente:utente fromUtenteWS:utenteWS];
utente.eliminato = YES;
}
continue;
}
if (!utente)
{
utente = [Utente utente:(int)idUtente];
[utentiNew addObject:utente];
}
[self setUtente:utente fromUtenteWS:utenteWS];
}
[BOTManagedObjectContext save];
[utenti addObjectsFromArray:utentiNew];
NSArray *sedi = [Sede sedeArray];
NSMutableArray *sediDel = [[NSMutableArray alloc] init];
NSMutableArray *contattiDel = [[NSMutableArray alloc] init];
for (NSDictionary *sedeWS in data[@"Sedi"])
{
NSInteger statoSede = [(NSNumber *)[NSString decrypt:sedeWS[@"Stato"]] integerValue];
long long idSede = [(NSNumber *)[NSString decrypt:sedeWS[@"IDSede"]] longLongValue];
Sede *sede = nil;
NSArray *sedeArray = [Sede sedeArray];
NSMutableDictionary *itemsByItemID = [NSMutableDictionary dictionary];
for (Sede *sede in sedeArray) {
itemsByItemID[@(sede.idSede)] = sede;
}
self.sedesBySedeID = itemsByItemID;
//for loop is too slow
/*for (Sede *sedeTmp in sedi)
{
@autoreleasepool {
if (sedeTmp.idSede == idSede)
{
sede = sedeTmp;
break;
}
}
}*/
//end of guilty for loop
if (!sede)//if enters here, local db is empty
{
if (statoSede == 2) //DELETE
continue;
sede = [BOTManagedObjectContext insertNewObjectForEntityForName:@"Sede"];
sede.idSede = idSede;
NSInteger idUtente = [(NSNumber *)[NSString decrypt:sedeWS[@"IDUtente"]] integerValue];
for (Utente *utente in utenti)
{
if (utente.idUtente == idUtente)
{
sede.utente = utente;
break;
}
}
for (NSDictionary *contattoWS in sedeWS[@"Contatti"])
{
if ([(NSNumber *)[NSString decrypt:contattoWS[@"Stato"]] integerValue] == 2) continue;
Contatto *contatto = [BOTManagedObjectContext insertNewObjectForEntityForName:@"Contatto"];
contatto.sede = sede;
[self setContatto:contatto fromContattoWS:contattoWS];
}
[self setSede:sede fromSedeWS:sedeWS];
}
else
{
if (statoSede == 2 && !sede.tour) //DELETE
{
[sediDel addObject:sede];
for (Contatto *contatto in sede.contattoCollection)
{
[contattiDel addObject:contatto];
}
continue;
}
for (NSDictionary *contattoWS in sedeWS[@"Contatti"])
{
NSInteger statoContatto = [(NSNumber *)[NSString decrypt:contattoWS[@"Stato"]] integerValue];
BOOL find = NO;
long long idContatto = [(NSNumber *)[NSString decrypt:contattoWS[@"IDContatto"]] longLongValue];
for (Contatto *contatto in sede.contattoCollection)
{
if (contatto.idContatto == idContatto)
{
find = YES;
if (statoContatto == 2) //DELETE
{
[contattiDel addObject:contatto];
}
else
{
[self setContatto:contatto fromContattoWS:contattoWS];
}
break;
}
}
if (!find)
{
if (statoContatto == 2) //DELETE
continue;
Contatto *contatto = [BOTManagedObjectContext insertNewObjectForEntityForName:@"Contatto"];
contatto.sede = sede;
[self setContatto:contatto fromContattoWS:contattoWS];
}
}
//controllo se ci sono contatti non presenti nel ws e in caso li elimino
for (Contatto *contatto in sede.contattoCollection)
{
BOOL find = NO;
for (NSDictionary *contattoWS in sedeWS[@"Contatti"])
{
long long idContatto = [(NSNumber *)[NSString decrypt:contattoWS[@"IDContatto"]] longLongValue];
if (contatto.idContatto == idContatto)
{
find = YES;
break;
}
}
if (!find)
{
[contattiDel addObject:contatto];
}
}
[self setSede:sede fromSedeWS:sedeWS];
if (statoSede == 2 && sede.tour)
sede.eliminata = YES;
}
}
[BOTManagedObjectContext save];
for (Contatto *contatto in contattiDel)
{
[BOTManagedObjectContext deleteObject:contatto];
}
[BOTManagedObjectContext save];
for (Sede *sede in sediDel)
{
[BOTManagedObjectContext deleteObject:sede];
}
[BOTManagedObjectContext save];
}
Run Code Online (Sandbox Code Playgroud)
谢谢.
执行许多查找的最快方法是将您NSArray转换为NSDictionary.此初始转换将采用线性时间,这与当前循环所用的时间相同.但是,未来的查找只需要一段时间!
NSArray *sedeArray = [Sede sedeArray];
NSMutableDictionary *itemsByItemID = [NSMutableDictionary dictionary];
for (Sede *sede in sedeArray) {
itemsByItemID[@(sede.idSede)] = sede;
}
self.sedesBySedeID = itemsByItemID;
Run Code Online (Sandbox Code Playgroud)
此方法只需要一段时间来查找对象.
- (Sede *)sedeForSedeID:(int)sedeID {
return self.sedesBySedeID[@(sedeID)];
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
190 次 |
| 最近记录: |