jjx*_*tra 5 core-data objective-c ios
我正在批量插入核心数据.我有一个person对象,这个person对象有一个名为"otherPeople"的关系,它是一个NSSet的人.当从下载批量插入数据时,事情是很好的,直到大约10,000人被读入,此时批量插入速度减慢到爬行.我每500次插入保存并重置我的NSManagedObjectContext.
如果我注释掉插入"otherPerson"关系的部分,则批量插入在整个下载过程中会很快.parseJSON分批调用500个JSONKit词典.
可能导致这种情况的任何想法?可能的解决方案?
码:
- (NSArray*) getPeople:(NSArray*)ids
{
NSFetchRequest* request = [[[NSFetchRequest alloc] init] autorelease];
NSEntityDescription* entityDescription = [NSEntityDescription entityForName:@"Person" inManagedObjectContext:context];
[request setEntity:entityDescription];
[request setFetchBatchSize:ids.count];
//Filter by array of ids
NSPredicate* predicate = [NSPredicate predicateWithFormat:@"externalId IN %@", ids];
[request setPredicate:predicate];
NSError* _error;
NSArray* people = [context executeFetchRequest:request error:&_error];
return people;
}
- (void) parseJSON:(NSArray*)people
{
NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
NSMutableArray* idsToFetch = [NSMutableSet setWithCapacity:CHUNK_SIZE * 3];
NSMutableDictionary* existingPeople = [NSMutableDictionary dictionaryWithCapacity:CHUNK_SIZE * 3];
// populate the existing people dictionary first, that way we know who is already in the context without having to do a fetch for each person in the array (externalId IS indexed)
for (NSDictionary* personDictionary in people)
{
// uses JSON kit to parse out all the external ids...
[PersonJSON addExternalIdsToArray:idsToFetch fromDictionary:personDictionary];
}
// see above code for getPeople implementation...
NSArray* existingPeopleArray = [self getPeople:idsToFetch];
for (Person* p in existingPeopleArray)
{
[existingPeople setObject:p forKey:p.externalId];
}
for (NSDictionary* personDictionary in people)
{
NSString* externalId = [personDictionary objectForKey:@"PersonId"];
Person* person = [existingPeople objectForKey:externalId];
if (person == nil)
{
// the person was not in the context, make a new person in the context
person = [[self newPerson] autorelease];
person.ancestryId = externalId;
[existingPeople setObject:person forKey:person.externalId];
}
// use JSON kit to populate the core data object...
[PersonJSON populatePerson:person withDictionary:personDictionary inContext:[self context]];
// these are just objects that contain an externalId, showing that the link hasn't been setup yet
for (UnresolvedOtherPerson* other in person.unresolvedOtherPeople)
{
Person* relatedPerson = [existingPeople objectForKey:other.externalId];
if (relatedPerson == nil)
{
relatedPerson = [[self newPerson] autorelease];
relatedPerson.externalId = other.externalId;
[existingPeople setObject:relatedPerson forKey:relatedPerson.externalId];
}
// add link - if I comment out this line, everything runs very fast
// if I don't comment out, things slow down gradually and then exponentially
[person addOtherPersonsObject:relatedPerson];
}
self.downloaded++;
}
[pool drain];
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1847 次 |
| 最近记录: |