有没有任何方法来优化数组中的循环?数组arr中有10,000个对象,所以循环将继续保持10k次,我必须在CfgBarCodeMask和CfgBarCodeMaskDetails之间建立关系。大约需要8分钟。如何减少这一次?
NSArray *arr=[coreDataEngine fetchObjectWithEntityName:@"CfgBarCodeMask" withPredicate:nil withSortDescriptor:nil error:nil ];
NSString *predicateString = [NSString stringWithFormat:@"barCodeMaskId == $idVar"];
NSPredicate *predicate = [NSPredicate predicateWithFormat:predicateString];
[arr enumerateObjectsUsingBlock:^(CfgBarCodeMask *barcodeMask, NSUInteger idx, BOOL *stop)
{
NSDictionary *variables = @{ @"idVar" : barcodeMask.id1 };
NSArray *destinationArray=
[coreDataEngine fetchObjectWithEntityName:@"CfgBarCodeMaskDetail"
withPredicate:[predicate predicateWithSubstitutionVariables:variables]
withSortDescriptor:nil error:nil ];
if ([destinationArray count] >0 ) {
[barcodeMask addMaskDetails:[NSSet setWithArray:destinationArray]];
}
}];发布于 2014-06-10 08:26:24
您可以使用将循环划分为多个批。每批处理约2000个对象,并使用并发NSManagedObjectContext并行执行所有修补程序。我从另一个数据库迁移600K对象时所做的事情。
发布于 2014-06-11 03:05:59
我觉得你应该有这样的东西
// Create concurency managed object context in your core data engine
_managedObject = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
[_managedObject setPersistentStoreCoordinator:_psCoordinator];
[_managedObject setUndoManager:nil];
// Batch1
NSPredicate *predicate = //create predicate to get object 1-2000
NSArray *arr=[coreDataEngine fetchObjectWithEntityName:@"CfgBarCodeMask" withPredicate:predicate withSortDescriptor:nil error:nil];
[self processObjects:arr];
// Batch2
predicate = //create predicate to get object 2000-4000
arr=[coreDataEngine fetchObjectWithEntityName:@"CfgBarCodeMask" withPredicate:predicate withSortDescriptor:nil error:nil];
[self processObjects:arr];
// Batch3
predicate = //create predicate to get object 4000-6000
arr=[coreDataEngine fetchObjectWithEntityName:@"CfgBarCodeMask" withPredicate:predicate withSortDescriptor:nil error:nil];
[self processObjects:arr];
// Batch4
predicate = //create predicate to get object 6K-8K
arr=[coreDataEngine fetchObjectWithEntityName:@"CfgBarCodeMask" withPredicate:predicate withSortDescriptor:nil error:nil];
[self processObjects:arr];
// Batch5
predicate = //create predicate to get object 8K-10K
arr=[coreDataEngine fetchObjectWithEntityName:@"CfgBarCodeMask" withPredicate:predicate withSortDescriptor:nil error:nil];
[self processObjects:arr];
(void)processObjects:(NSArray) objects
{
[_managedObject performBlock: {
NSString *predicateString = [NSString stringWithFormat:@"barCodeMaskId == $idVar"];
NSPredicate *predicate = [NSPredicate predicateWithFormat:predicateString];
[arr enumerateObjectsUsingBlock:^(CfgBarCodeMask *barcodeMask, NSUInteger idx, BOOL *stop)
{
NSDictionary *variables = @{ @"idVar" : barcodeMask.id1 };
NSArray *destinationArray=
[coreDataEngine fetchObjectWithEntityName:@"CfgBarCodeMaskDetail"
withPredicate:[predicate predicateWithSubstitutionVariables:variables]
withSortDescriptor:nil error:nil ];
if ([destinationArray count] >0 ) {
[barcodeMask addMaskDetails:[NSSet setWithArray:destinationArray]];
}
}];
[_managedObject save:nil];
}];
}https://stackoverflow.com/questions/24134089
复制相似问题