IOS / Objective-C:null的测试日期非常慢

时间:2016-09-27 12:58:07

标签: ios objective-c nsdate

我有一些运行速度非常慢的代码。我将问题缩小到以下几行。如果注释掉,代码会快速运行。如果存在,此过程可能需要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

的形式登录到控制台

任何人都可以帮我弄清楚导致代码运行的原因是什么?

谢谢。

2 个答案:

答案 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并使用