2016-02-27 69 views
0

所以,我有兩種方法:編碼效率VS執行效率

-(void)importEvents:(NSArray*)allEvents { 
    NSMutableDictionary *subjectAssociation = [[NSMutableDictionary alloc] init]; 

    for (id thisEvent in allEvents) { 
     if (classHour.SubjectShort && classHour.Subject) { 
      [subjectAssociation setObject: classHour.Subject forKey:classHour.SubjectShort]; 
     } 
    } 

    [self storeSubjects:subjectAssociation]; 
} 

-(void)storeSubjects:(NSMutableDictionary*)subjects { 
    NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDir = [documentPaths objectAtIndex:0]; 
    NSString *subjectsList = [documentsDir stringByAppendingPathComponent:@"Subjects.plist"]; 

    [subjects writeToFile:subjectsList atomically:YES]; 
} 

第一循環通過假設100個項目組成的數組,並建立約10個獨特的鍵/值對的NSMutableDictionary。

第二種方法將此字典寫入文件以供在我的應用程序中的其他地方參考。

第一種方法經常被調用,第二種方法也是如此。但是,我知道,一旦字典被構建和保存,無論我多麼頻繁地調用這些方法,它的內容都不會改變,因爲可能值的數量是有限的。

問題:考慮到第二個方法本質上只需要執行一次的事實,我應該添加一些行來檢查文件是否已經存在,基本上添加了需要執行的代碼,或者我可以將它保留爲是,一遍又一遍覆蓋一個現有的文件?

我應該在意嗎?我應該補充說,我似乎沒有任何性能問題,所以這更多的是一個哲學/衛生問題。

謝謝

+1

您提到「供我的應用程序中的其他地方參考」。所以你寫入磁盤的唯一原因是從同一個應用程序中的其他地方再次打開它?那麼爲什麼不把它存儲在一個變量中以便以後訪問數據呢? – Joost

+0

因爲應用程序可能被強制退出,並且我需要依賴這樣一個事實,即在重新啓動時執行任何代碼之前,此信息可用 – Sjakelien

回答

1

這取決於。

你說

一旦字典是建立和保存,它的內容永遠不會改變

,直到他們做:-)

如果您的應用不患在這個特定的循環中,我不會嘗試緩存任何性能問題,因爲除非您記住您在文件上只有一次寫入,否則您將在稍後存儲一個錯誤。

這可以通過在方法上使用意圖揭示名稱來緩解。即

-(void)storeSubjectsOnceOnlyPerLaunch:(NSDictionary*)subjects 

如果我有時間追溯緩存引起的錯誤,我會有好幾天回到我的生活中。

0

您的解決方案完全過度設計,並且存在大量潛在的問題。如果用戶驅動器已滿,該怎麼辦?這個文件是否被備份?它是否需要備份/是否在浪費用戶時間進行備份?這可能會失敗嗎?你正在處理它嗎?您專注於輸入和存儲數據,您應該專注於訪問該數據。

我會有一個readwrite屬性allEvents和一個屬性eventAssociations,在接口中聲明爲readonly,但是在實現文件中是readwrite。

allEvents setter存儲allEvents並將_eventAssociations設置爲nil。 eventAssociations getter會檢查_eventAssociations是否爲零,並在需要時重新計算它。一個簡單和防彈模式。