我有这段代码:
-(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 秒)。这个是正常的?或者我的方法可能有问题?
这是我的数据模型:
最佳答案
这里有一些建议。
首先。为了以有效的方式导入数据,我将遵循我之前的回答: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/