2016-07-05 5 views
0

私はWebサービス(15.000アドレス)からアドレスのリストをダウンロードしています。すべてのアドレスを取得するには800ms、CoreDataに書き込むにはさらに15秒かかりました。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:'メソッドを使用しました'NSManagedObjectContext'から' save: 'メソッドを使用できる' NSManagedObject'から取得します。あなたのすべての 'NSManagedObject'を作成し、コンテキストで保存を実行してください。 – Larme

答えて

0

私は間違っているいくつかのアドバイスを与えてください!

問題は、毎回managedObjectContextを保存していたため、繰り返しが完了したときにのみ保存する必要がありました。ループについては、以下の

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

はちょうどこの行を移動しました。

関連する問題