2016-07-05 105 views
0

我正在从webservice(15.000地址)下载地址列表。花费800毫秒可以获得所有地址,并花费额外的15秒将它们写入CoreData。请给些建议,我是错的:CoreData写入对象缓慢

AppDelegate *delegate = [[UIApplication sharedApplication] delegate]; 
      NSManagedObjectContext *managedObjectContext = delegate.managedObjectContext; 
      for (NSDictionary *dict in addresses) { 
       [self saveAddressesToCoreDataWithDictionary:dict andManagedObject:managedObjectContext]; 
      } 
      [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"alreadyDownloaded"]; 

和方法:

-(void)saveAddressesToCoreDataWithDictionary:(NSDictionary *)dict andManagedObject:(NSManagedObjectContext *)managedObject 
{ 

    NSManagedObject *address; 
    address = [NSEntityDescription insertNewObjectForEntityForName:@"Address" inManagedObjectContext:managedObject]; 

    [address setValue:[[dict objectForKey:@"lat"] stringValue] forKey:@"lat"]; 
    [address setValue:[[dict objectForKey:@"lon"] stringValue] forKey:@"lon"]; 
    [address setValue:[dict objectForKey:@"addressLong"] forKey:@"addressLong"]; 
    [address setValue:[dict objectForKey:@"addressShort"] forKey:@"addressShort"]; 
    NSError *error; 
    [managedObject save:&error]; 

} 
+0

如果我没有记错的话,你可以将所有的'NSDictionary'对象转换成'Address'实体('NSManagedObject'),并将它们全部保存(使用'NSManagedObjectContext'),而不是一个接一个地保存它们花更多的时间。您可以通过查找“Core Data Save Batch”来获得更多信息,就像那里:http://stackoverflow.com/questions/4145888/ios-coredata-batch-insert – Larme

+0

@Larme任何提示?我没有太多的CD经验。 – Stefan

+0

https://developer.apple.com/library/prerelease/content/documentation/Cocoa/Conceptual/CoreData/CreatingObjects.html#//apple_ref/doc/uid/TP40001075-CH5-SW4您使用了'save:'方法从'NSManagedObject',你可以在'NSManagedObjectContext'中使用'save:'方法。创建所有的'NSManagedObject',然后用上下文执行保存。 – Larme

回答

0

想通了!

问题在于我每次都保存managedObjectContext,只有在迭代完成时才应保存它。

刚搬进这一行:

if ([managedObjectContext save:&error] == NO) { 
       NSAssert(NO, @"Error saving context: %@\n%@", [error localizedDescription], [error userInfo]); 
      } 

下面的for循环。