我有一些运行速度非常慢的代码。我将问题缩小到以下几行。如果注释掉,代码会快速运行。如果存在,此过程可能需要30秒或更长时间,尽管编译器或运行时未报告错误。
我在临时对象中有如下日期:
$output_file = '';//location file in server and extension
$base64_string = '';//code base64
$ifp = fopen($output_file, "wb");
fwrite($ifp, base64_decode($base64_string));
fclose($ifp);
如果我将其记录到控制台,则记录为:
NSDate *lastedited = importObject.lastedited;
以上不会导致延迟
当我然后将其保存在2015-10-08 08:44:51 +0000
中时,我首先检查它是否为空。但是,以下代码是造成极端延迟的原因:
Core Data
修改
我发现即使拿出测试,行if (lastedited != (id)[NSNull null]){
[record setValue:lastedited forKey:@"lastedited"];
}
的运行速度也非常慢。
尽管实体中的[record setValue:lastedited forKey:@"lastedited"]
是数据模型中的NSDate,但这是事实。
正如顶部的行显示它是NSDate的形式,并以lastedited
任何人都可以帮我弄清楚导致代码运行的原因是什么?
谢谢。
答案 0 :(得分:0)
您是否有理由不仅仅针对nil进行测试?
if (lastedited != nil) {
....
}
这里对Objective-C / Cocoa中不同类型的内容进行了很好的概述:http://nshipster.com/nil/
答案 1 :(得分:0)
我认为问题在于lastedited
实体中Coredata
字段的数据类型。您使用的数据类型是NSDate
,它当然不是Coredata
支持的原始数据类型。如果数据类型不是基本类型之一(如int,float,double,String,NSTimeInterval),Coredata将首先将其转换为其中一种基本类型。在您的情况下,日期将在保存之前转换为NSTimeInterval,这是一个庞大的过程并且需要比预期更多的时间。因此,如果您在保存之前将NSDate转换为NSTimeInterval的开销,则该过程将变得更快。试试这个
[record setValue:([lastedited timeIntervalSince1970] * 1000) forKey:@"lastedited"];
不要忘记在实体的.h文件中更改已加载到NSTimeInterval的数据类型。
@property (nullable, nonatomic, copy) NSTimeInterval *lastedited;
请记住,您现在将日期保存为coredata的毫秒数。因此,无论何时从coredata获取它,都将其转换为NSDate并使用