0

我有这段代码:

-(void)createArtistsFromArray:(NSArray*)jsonAttrArr {

    NSError *fetchError = nil;
    if (jsonAttrArr) {

        for(NSMutableDictionary *dic in jsonAttrArr) {

            NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
            [fetchRequest setEntity:[NSEntityDescription entityForName:@"Artists" inManagedObjectContext:[sharedAppDelegate managedObjectContext]]];
            NSPredicate *predicateById = [NSPredicate predicateWithFormat:@"artistId == %@", [dic objectForKey:@"artistId"]];
            [fetchRequest setPredicate:predicateById];

            NSArray *categorisItems = [[sharedAppDelegate managedObjectContext] executeFetchRequest:fetchRequest error:&fetchError];

            Artists *artistObj = [NSObject returnItemUsingFetchingResults:categorisItems andEntityName:@"Artists"];
            [self setAttrForEntity:artistObj withDictionary: dic];
            [self createElementEntityFromDictionary:dic andArtist:artistObj];


        }

    }
    NSError *error;
    if (![[sharedAppDelegate managedObjectContext] save:&error])
        NSLog(@"Error saving - error:%@" , error);

}

-(IBAction)createElementEntityFromDictionary:(id)sender andArtist:(Artists*)aObj {

    NSMutableOrderedSet* setWithElements = [[NSMutableOrderedSet alloc] init];
    NSError *fetchError = nil;

        NSArray *elements = [(NSDictionary*)sender objectForKey:@"elements"];

        NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
        [fetchRequest setEntity:[NSEntityDescription entityForName:@"Element" inManagedObjectContext:[sharedAppDelegate managedObjectContext]]];

        int forCounter = 0;
        for (NSDictionary *elementInputDictionary in elements) {

            [fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"elementId == %i", [[elementInputDictionary objectForKey:@"elementId"] integerValue]]];
            NSArray *items = [[sharedAppDelegate managedObjectContext] executeFetchRequest:fetchRequest error:&fetchError];

            Element* outputElement = [NSObject returnItemUsingFetchingResults:items andEntityName:@"Element"];
            [outputElement setCatId:aObj.artistId];
            [outputElement setOrderNo:forCounter];

            [self setAttrForEntity:outputElement withDictionary: elementInputDictionary];

            outputElement.images = [self setImagesToElement:outputElement fromList:[elementInputDictionary objectForKey:@"imagesList"]];
            [setWithElements addObject: outputElement];
            forCounter++;


        aObj.elements = setWithElements;
    }

    NSError *error;
    if (![[sharedAppDelegate managedObjectContext] save:&error]) {
        NSLog(@"Error saving - error:%@" , error);
    }

}

-(void)setAttrForEntity:(id)entityName withDictionary:(NSDictionary*)attrDictionary {
    NSDictionary *attributes = [[entityName entity] attributesByName];
    for (NSString *attribute in attributes) {
        id value = [attrDictionary objectForKey:attribute];
        if (!value) continue;
        [entityName setValue:value forKey:attribute];
    }
}

在类别 NSObject 中:

+(id)returnItemUsingFetchingResults:(NSArray*)fResults andEntityName:(NSString*)name {
    if([fResults isEmpty])
        return [NSEntityDescription insertNewObjectForEntityForName:name inManagedObjectContext:[sharedAppDelegate managedObjectContext]];
    else
        return [fResults firstObject];
}

而这个操作需要一些时间(对于 800 Artists 实体大约需要 45 秒)。这个是正常的?或者我的方法可能有问题?

这是我的数据模型: 在此处输入图像描述

4

1 回答 1

1

这里的建议很少。

第一的。为了以有效的方式导入数据,我会按照我之前的回答:What is the most effective way to sync Core Data with JSON API

第二。在后台线程中移动代码可能会很好,因为这样可以避免主线程冻结。向用户显示等待指示器。在这里,您可以利用新的 CD API(从 iOS 5 开始)或传统方式。这里有一些注意事项:iPhone iOS 如何合并 Core Data NSManagedObjectContext?.

关于你的问题。我认为导入需要这么长时间是正常的。您执行选择特定对象的查询。无论如何,可以按照第一个链接修改代码。

希望能帮助到你。

于 2013-05-05T20:32:28.097 回答