2016-09-27 33 views
0

我有一些運行速度非常慢的代碼。我把這個問題縮小到了以下幾行。如果註釋掉,代碼會很快運行。如果存在,該過程可能需要30秒或更長時間,儘管編譯器或運行時沒有報告錯誤。IOS/Objective-C:測試日期爲null很慢

我有如下的臨時對象日期:

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"]極爲緩慢。

儘管實體中的lastedited是數據模型中的NSDate。

而且在頂部行顯示它是一個NSDate和日誌的形式向控制檯2015-10-08 08:44:51 +0000

誰能幫我找出是什麼原因造成的代碼,因此運行緩慢?

謝謝。

+0

核心數據實體中的嵌套字段的數據類型是什麼?它是NSDate還是NSTimeInterval? – Arun

+0

NSDate在覈心數據文件的.h文件中以及在Model.scdatamodeld – user6631314

+0

中查看* slow * *有多慢? – vikingosegundo

回答

0

有沒有一個原因,你不是簡單地測試零?

if (lastedited != nil) { 
    .... 
} 

這裏是在Objective-C /可可不同種類的沒有很好的概述:http://nshipster.com/nil/

0

我認爲這個問題是在你的Coredata實體lastedited字段的數據類型。您使用的數據類型是NSDate,這當然不是Coredata支持的原始數據類型。如果數據類型不是基本類型(如int,float,double,String,NSTimeInterval)之一,則Coredata將首先將其轉換爲其中一種基本類型。在你的情況下,日期在保存之前轉換爲NSTimeInterval,這是一個龐大的過程,需要比預期更多的時間。因此,如果您在保存之前將NSDate轉換爲NSTimeInterval的開銷,該過程將變得更快。試試這個

[record setValue:([lastedited timeIntervalSince1970] * 1000) forKey:@"lastedited"]; 

不要忘了在實體的.h文件中將lastedited的數據類型更改爲NSTimeInterval。

@property (nullable, nonatomic, copy) NSTimeInterval *lastedited; 

請記住,您現在將日期保存爲毫秒。因此,無論何時從coredata中獲取它,將其轉換爲NSDate並使用

+0

:* NSDate對象封裝了一個時間點,與任何特定的日曆系統或時區無關。日期對象是不可變的,表示相對於絕對引用日期(2001年1月1日00:00:00 UTC)的不變時間間隔。*概念'NSDate'只是一個時間間隔的輕量級包裝。所以你的建議不太可能會顯着改善執行時間。 – vikingosegundo