ios - CoreData 谓词和获取输入需要很长时间

标签 ios objective-c core-data nsmanagedobject

我有这段代码:

-(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 个艺术家实体,大约需要 45 秒)。这个是正常的?或者我的方法可能有问题?

这是我的数据模型: enter image description here

最佳答案

这里有一些建议。

首先。为了以有效的方式导入数据,我将遵循我之前的回答:What is the most efficient way to sync Core Data with JSON API .

其次。在后台线程中移动代码可能会很好,因为这样可以避免主线程卡住。向用户显示等待指示器。在这里您可以利用新的 CD API(自 iOS 5 起)或传统方式。这里有一些注释:iPhone iOS how to merge Core Data NSManagedObjectContext? .

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

希望对您有所帮助。

关于ios - CoreData 谓词和获取输入需要很长时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16386711/

相关文章:

android - 是否有 cordova-cli 命令使用目录项目中的最后一个构建来安装应用程序?

objective-c - @synthesize variable = t_variable 到底有什么作用?是不是很有帮助?

python - 等待 NSTask 完成终端命令的执行

objective-c - 使用 NSPredicate 判断一个字符串是否等于另一个字符串

objective-c - Mac OS X 程序提供 EXC_BAD_ACCESS

objective-c - 一对多关系中的 KVO 对象属性

iOS - 运行 Swift 单元测试时找不到 'MyProject-Swift.h' 文件

objective-c - CoreData - NSPredicate 与 NSSet

iphone - 核心数据多线程 - View Controller 未更新

ios - 针对不同设备方向在横向和纵向 View Controller 之间共享数据的最佳技术