2011-01-22 1 views
3

У меня есть следующий код, и мне было интересно, есть ли способ сделать это быстрее. В основном мое приложение загружает некоторые JSON (около 4000 записей) из сети и обновляет или создает мои управляемые объекты на основе данных. На данный момент это довольно медленно, и я понимаю, почему, но я новичок в основных данных, поэтому мне было интересно, есть ли что-нибудь, что я могу сделать, чтобы сделать это быстрее?Обновление основных данных, если существует или создать новый управляемый объект. Могу ли я сделать это быстрее?

NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Company" inManagedObjectContext:managedObjectContext]; 
[request setEntity:entity]; 
NSMutableArray *coreDataArray = [[managedObjectContext executeFetchRequest:request error:nil] mutableCopy]; 
[request release]; 

for (NSDictionary *dict in arr) { 
    NSArray *filtered = [coreDataArray filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"(code == %@)", [dict objectForKey:@"Code"]]]; 
    //NSLog(@"COREDATA ARRAY: %d FILTERED ARRAY: %d CODE: %@ COREDATA FIRST CODE: %@", [coreDataArray count], [filtered count], [dict objectForKey:@"Code"], [[coreDataArray objectAtIndex:0] code]); 
    if ([filtered count] > 0) { 
    Company *c = [filtered objectAtIndex:0]; 
    if ([dict objectForKey:@"Defunct"]) { 
    NSLog(@"DELETED DEFUNCT COMPANY"); 
    [managedObjectContext deleteObject:c]; 
    } else { 
    [c populateWithJSONDictionary:dict]; 
    } 
    } else { 
    Company *c = (Company *)[NSEntityDescription insertNewObjectForEntityForName:@"Company" inManagedObjectContext:managedObjectContext]; 
    [c populateWithJSONDictionary:dict]; 
    } 

    float percent = (float)[arr indexOfObject:dict]/[arr count]; 
    [self performSelectorInBackground:@selector(updateProgressView:) withObject:[NSString stringWithFormat:@"%f",percent]]; 
} 

[coreDataArray release]; 

Большое спасибо за помощь, которую вы можете дать.

+0

вы уверены, что выборка данных JSON не выдавать для замедления вашего приложения вниз, если вы используете SBJSON. Потому что он медленнее других почти 9 раз. А также, пожалуйста, примите некоторые ответы. – Robin

+0

привет, нет разбора JSON очень быстро, я использую JSON Framework. Я уверен, что это фильтрованный массив внутри цикла for, который замедляет его. – Marky

ответ

2

Вы должны проверить Core Data Programming Guide: Performance раздел

Он имеет некоторые конкретные рекомендации для выполнения импорта данных.

В случае Apple, перемещает документы снова, вот хороший поисковый запрос на Google site:developer.apple.com core data import performance

+0

спасибо, прочитав, что помогло. странно, я не заметил этого раздела, когда я его читал раньше. – Marky

+1

@chris Wanger ссылка мертва, вот почему ppl нужно больше объяснений в своих ответах, а не только мертвую ссылку. теперь это бесполезный принятый ответ. – Aragunz

+1

Да, это сложный баланс между срывом фреймворков Apple и привязкой к ним напрямую. Я обновил ответ. –