2013-05-05 65 views
0

我有这样一段代码:CoreData谓词和获取输入需要的方式来长

-(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

回答

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?

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

希望它有帮助。