2010-12-13 4 views
0

ウェブサービスからxmlを取得してコアデータに保存するデータインポートでメモリの問題が発生しました。ここiPadのコアデータを使用してデータをインポートするときにメモリ不足の問題が発生しました

は私のコードです:

for (int m=0; m < [manufacturers count]; m++) { 

    NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:kClientListURLv2, [[manufacturers objectAtIndex:m]ManufacturerID]]]; 
    NSLog(@"getting data:%@", url) ; 
    NSArray *array = [[NSArray alloc] initWithContentsOfURL:url]; 
    int j = 0; 
    for (NSDictionary* dict in array) { 
     j=j+1; 
     Client *entity = (Client*) [NSEntityDescription insertNewObjectForEntityForName:@"Client" inManagedObjectContext:managedObjectContext]; 
     //[entity setValuesForKeysWithDictionary:dict]; 
     [entity setBillingState:[dict valueForKey:@"BillingState"]]; 
     [entity setBillingCity:[dict valueForKey:@"BillingCity"]]; 
     [entity setBillingCountry:[dict valueForKey:@"BillingCountry"]]; 
     [entity setCurrentBalance:[dict valueForKey:@"CurrentBalance"]]; 
     [entity setArOver90:[dict valueForKey:@"ArOver90"]]; 
     [entity setPassword:[dict valueForKey:@"Password"]]; 
     [entity setPricingDiscount:[dict valueForKey:@"PricingDiscount"]]; 
     [entity setEmail:[dict valueForKey:@"Email"]]; 
     [entity setCompanyName:[dict valueForKey:@"CompanyName"]]; 
     [entity setClientID:[dict valueForKey:@"ClientID"]]; 
     [entity setAr6190:[dict valueForKey:@"Ar6190"]]; 
     [entity setBillingAddress2:[dict valueForKey:@"BillingAddress2"]]; 
     [entity setLastName:[dict valueForKey:@"LastName"]]; 
     [entity setContactName:[dict valueForKey:@"ContactName"]]; 
     [entity setAr3160:[dict valueForKey:@"Ar3160"]]; 
     [entity setSalesRepID:[dict valueForKey:@"SalesRepID"]]; 
     [entity setShippingAddress2:[dict valueForKey:@"ShippingAddress2"]]; 
     [entity setShippingCity:[dict valueForKey:@"ShippingCity"]]; 
     [entity setManufacturerID:[dict valueForKey:@"ManufacturerID"]]; 
     [entity setShippingState:[dict valueForKey:@"ShippingState"]]; 
     [entity setAr30:[dict valueForKey:@"Ar30"]]; 
     [entity setBillingZip:[dict valueForKey:@"BillingZip"]]; 
     [entity setShippingAddress:[dict valueForKey:@"ShippingAddress"]]; 
     [entity setShippingZip:[dict valueForKey:@"ShippingZip"]]; 
     [entity setURL:[dict valueForKey:@"URL"]]; 
     [entity setPhone:[dict valueForKey:@"Phone"]]; 
     [entity setCreditLimit:[dict valueForKey:@"CreditLimit"]]; 
     [entity setClientStatus:[dict valueForKey:@"ClientStatus"]]; 
     [entity setFax:[dict valueForKey:@"Fax"]]; 
     [entity setIsDeleted:[dict valueForKey:@"IsDeleted"]]; 
     [entity setShippingCountry:[dict valueForKey:@"ShippingCountry"]]; 
     [entity setClientNumber:[dict valueForKey:@"ClientNumber"]]; 
     [entity setBillingAddress:[dict valueForKey:@"BillingAddress"]]; 
     [entity setUsername:[dict valueForKey:@"Username"]]; 
     [entity setIsAddedToServer:[dict valueForKey:@"IsAddedToServer"]]; 
     [entity setFirstName:[dict valueForKey:@"FirstName"]]; 
     [entity setRepNumber:[dict valueForKey:@"RepNumber"]]; 
     [entity setManufacturer:[manufacturers objectAtIndex:m]]; 
     [entity setIsAddedToServer:[NSNumber numberWithInt:1]]; 

     for (NSDictionary* dict2 in [dict valueForKey:@"ShippingAddresses"]) { 

      if ([[NSString stringWithFormat:@"%@", [dict valueForKey:@"ShippingAddresses"]] length] > 1) { 
       ShippingAddress *taggedItem = (ShippingAddress *) [NSEntityDescription insertNewObjectForEntityForName:@"ShippingAddress" inManagedObjectContext:managedObjectContext]; 
       [taggedItem setValuesForKeysWithDictionary:dict2]; 
       [taggedItem setClient: entity]; 

       NSError *error; 
       if (![managedObjectContext save:&error]) { 
        NSLog(@"Save Error: %@",error); 
       } 
      } 
     } 

     if (j%saveThreshold==0) { 
      NSLog(@"Saving after 500 items"); 
      NSError *error; 
      if (![managedObjectContext save:&error]) { 
       NSLog(@"Save Error: %@",error); 
      } 
     } 
    } 

    [array release]; 
    NSError *entityerror; 
    if (![managedObjectContext save:&entityerror]) { 
     // //Handle the error. 
     NSLog(@"\n\n\n Error saving: %@ \n\n\n\n",entityerror); 
    } 
} 

基本的に、これはをループして、私のNSManagedObjectsのすべてを作成し、コードは素晴らしい仕事と非常に高速ですが、メモリが増えるごとに500

後にコンテキストを保存していますクライアントがダウンロードしている可能性がある場合は、メモリが足りないためにアプリケーションがクラッシュします。 managedObjectContextに何らかのリリースや何かできることはありますか?ここではストローで把握してください。

答えて

2

あなたは別の方法で

for (int m=0; m < [manufacturers count]; m++) { 
} 

の内側に穴コードを配置し、その周りにいくつかの

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init]; 
[pool drain]; 

を置くことを試みることができます。これにより、NSArray *arrayが完全に解放されます。 releaseで削除されない理由を私に聞かないでくださいが、私は数週間前に同じ問題がありました。

パフォーマンスツール、特にオブジェクトの割り当てとリークでプロジェクトを実行できます。 いつどのくらいのメモリを使用するか表示されます。

+0

これはこのコードの他の部分を助けましたが、私は別のチャンクにインポートを分割しなければなりません。合計データダウンロードサイズは現在3メガ以上です。私はそれを開いていると思います。 – Slee

+0

あなたは間違いなくダウンロードファイルを分割する必要があります。 iPhone 3Gには約40MBの使用可能なメモリしかありません。新しいオブジェクトをダウンロードしながらオブジェクトを分解するパーサを構築することもできます。 (私はすでにurlのパーサーがあると思います...)複数のファイルを持ち、それぞれを別々にロードし、AutoreleasePoolで解析してから次のファイルを読み込むと、ずっと簡単になります。 –

関連する問題