2016-02-17 11 views
0

我嘗試保存coredata許多對象,但得到這個崩潰:節約大量物體在coredata

Communications error: <OS_xpc_error: <error: 0x19b354af0> { count = 1, contents = 
    "XPCErrorDescription" => <string: 0x19b354e50> { length = 22, contents = "Connection interrupted" } 
}> 
Message from debugger: Terminated due to memory issue 

我用MagicalRecord:

[MagicalRecord saveInBackgroundWithBlock:^(NSManagedObjectContext *localContext){ 
            for (int i = 0; i < json.count; i++) { 
             [Product parseWithData:((NSMutableArray *)json)[i]]; 
            } 
           }]; 

Product.m

+ (void)parseWithData:(NSDictionary *)dictionary { 

     NSString *xml_id = [dictionary[@"XML_ID"] isKindOfClass:[NSString class]] ? dictionary[@"XML_ID"] : @""; 

     Product *product = [Product getProductWithXML_id:xml_id]; 
     if (!product) 
      product = [Product MR_createEntity]; 

     product.xml_id = xml_id; 
     product.code = [dictionary[@"Code"] isKindOfClass:[NSString class]] ? dictionary[@"Code"] : @""; 
     ... 
} 

你能建議我嗎,我該如何保存它?

,當我在環救我的對象,以核心數據 - 存儲增長速度非常快 enter image description here

回答

0

這似乎是內存問題。

嘗試圍繞你for循環的內部與

autoreleasepool { 
    ... 
} 
0

你需要你分頁獲取數據的方式和/或保存。

通過PAGINATE,我的意思是:

  1. 下載第1000(例如,它取決於內容真的)
  2. 當其完成後,保存1000你只是去
  3. 時所完成,獲得下一個1000,再次保存,等等。

您需要知道您嘗試獲取和使用的數字(如果我沒記錯的話)SetLimit:在解析方法和SetSkip上。跳過跳過X個第一個元素,並且限制是將被下載的項目的最大數量。 通過這種方式,您可以跳過限值爲1000的0,然後使用skip + = limit調用該方法,您將獲得第二個1000塊,依此類推。最後一個塊顯然會小於1000.

這樣做會大幅增加所花費的時間,但這可以在後臺無縫完成;但它會傳播到足夠少的內存需要。

這樣做,看看它是否有很大的不同。如果沒有,你可以減少到500而不是1000,或者完全改變你的架構;也許你甚至不需要全部的項目吧!