我尝试在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"] : @"";
...
}
你能建议我,我怎么能保存它?
答案 0 :(得分:0)
这似乎是一个记忆问题。
尝试使用
围绕for
循环的内部部分
autoreleasepool {
...
}
答案 1 :(得分:0)
您需要对获取数据和/或保存数据进行分页。
通过分页,我的意思是:
你需要知道你想要获得的数字并使用(如果我没记错的话)SetLimit:在解析方法和SetSkip上。跳过跳过X个第一个元素,限制是将下载的最大项目数。 这样,你跳过0限制1000,然后用skip + = limit调用方法,你将得到第二个1000块,依此类推。最后一个块显然会小于1000。
这样做会大大增加所花费的时间,但这可以在后台无缝完成;但它会扩散到足以需要更少的内存。
做到这一点,看看它是否有很大的不同。如果没有,您可以始终减少到500而不是1000,或者完全改变您的架构;也许你现在甚至不需要 ALL 这些项目!