在coredata中保存大量对象

Posted

技术标签:

【中文标题】在coredata中保存大量对象【英文标题】:Save a large number of objects in coredata 【发布时间】:2016-02-17 19:26:08 【问题描述】:

我尝试在 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]];
                                    
                                ];

产品.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"] : @""; 
        ...

你能建议我吗,我该如何保存它?

当我将对象循环保存到核心数据时 - 内存增长非常快

【问题讨论】:

【参考方案1】:

这似乎是一个内存问题。

尝试用

包围你的for循环的内部部分
autoreleasepool 
   ...

【讨论】:

【参考方案2】:

您需要对获取数据和/或保存数据的方式进行分页。

分页是指:

    下载前1000个(例如,这取决于内容) 完成后,保存 1000 条即可 完成后,获取下一个 1000,再次保存,依此类推。

您需要知道要获取的数字并在解析方法上使用(如果我没记错的话)SetLimit: 和 SetSkip。跳过跳过第 X 个元素,限制是将下载的最大项目数。 这样,你用 limit 1000 跳过 0,然后用 skip += limit 调用方法,你会得到第二个 1000 块,依此类推。最后一个块显然会小于 1000。

这样做会大大增加花费的时间,但这可以在后台无缝完成;但它会分布得足够多,需要更少的内存。

这样做,看看它是否有很大的不同。如果没有,你总是可以减少到 500 而不是 1000,或者完全改变你的架构;也许你现在甚至不需要ALL这些项目!

【讨论】:

以上是关于在coredata中保存大量对象的主要内容,如果未能解决你的问题,请参考以下文章

(CoreData) MagicalRecord 突然停止持久保存

数据导入CoreData期间如何显示progressBar?

以一个名称将多个对象保存到 coredata

如何以一个名称将多个对象保存到 CoreData

尝试在块中保存对象时崩溃。 (CoreData 无法满足...的错误)

使用 CoreData 与内存中的内存占用优势不明显/不明显 - 意见?