首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >循环优化/ CoreData优化

循环优化/ CoreData优化
EN

Stack Overflow用户
提问于 2014-06-10 06:13:51
回答 2查看 88关注 0票数 0

有没有任何方法来优化数组中的循环?数组arr中有10,000个对象,所以循环将继续保持10k次,我必须在CfgBarCodeMask和CfgBarCodeMaskDetails之间建立关系。大约需要8分钟。如何减少这一次?

代码语言:javascript
复制
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]];
    }           
}];
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-06-10 08:26:24

您可以使用将循环划分为多个批。每批处理约2000个对象,并使用并发NSManagedObjectContext并行执行所有修补程序。我从另一个数据库迁移600K对象时所做的事情。

票数 1
EN

Stack Overflow用户

发布于 2014-06-11 03:05:59

我觉得你应该有这样的东西

代码语言:javascript
复制
// 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];
    }];
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24134089

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档