我有这段代码:
-(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秒)。这个是正常的?或者我的方法可能有问题吗?
这是我的数据模型:
答案 0 :(得分:1)
这里很少有建议。
首先。要以有效的方式导入数据,我会按照我之前的答案: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?。
关于你的问题。我认为导入花费这么多时间是正常的。您执行选择特定对象的查询。无论如何,可以在第一个链接之后修改代码。
希望它有所帮助。