2

我有一個從* .xml文件導入信息的CoreData應用程序。該文件有兩個部分,摘要和詳細信息。CoreData NSArrayController addObject:Agonizingly Slow

實質上,我有兩個表視圖,tvSummary和tvDetail;兩個陣列控制器,acSummary和acDetail;和一個可變數組maDetail。

當我導入文件時,我使用[acSummary addObject:newSummaryData];方法將彙總數據記錄添加到acSummary數組控制器。一旦文件被導入,彙總數據字段將填充tvSummary表視圖。

當我使用[acDetail addObject:newDetailData];方法將詳細數據記錄添加到acDetail陣列控制器時,導入多達72000條記錄(大多數文件包含3600到21600條記錄)可能需要20分鐘以上的時間。一旦這個冗長的過程完成,導入的詳細數據字段將填充tvDetail表視圖。當我在tvSummary表格視圖中進行選擇時,顯示在tvDetail表格視圖中的數據會更改爲與所選行相匹配。我認爲這是它應該如何工作的。在Cocoa/Objective-C/Core數據學習過程中(我仍然是新手),我發現我可以在大約五秒內將72000條記錄複製到maDetail可變數組中。我還發現我可以使用[acDetail setContent:maDetail];方法在大約兩秒內將maDetail可變數組的內容複製到acDetail陣列控制器。

我不明白的是如何讓acDetail數組控制器記住它在tvSummary表視圖中選擇不同的行時給出的內容。我看到引用強制數組控制器'保存',但是,我找不到有關如何實現這種方法的任何文檔。任何意見或方向將不勝感激。

回答

1

NSArrayController是,該類的文檔告訴我們,「管理對象集合的綁定兼容類」。 Cocoa綁定就像是一個自動控制器,它可以在模型和視圖對象之間同步數據 - 每次修改綁定屬性時,綁定到該屬性的所有對象都會得到通知,並會根據需要進行更新。

如果您通過NSArrayController一次將72,000個對象添加到可變數組中,可能會發送大量不必要的通知,並且會執行大量無用的更新。有幾種方法可以解決這個問題,但我建議先嚐試最簡單的方法......

不是單獨添加每個記錄,而是將所有記錄添加到單獨的可變數組中。完成後,使用NSArrayController的-addObjects:方法一次將所有對象添加到託管數組。這應該通知觀察者數組已經改變了一次而不是每個對象一次,並且我認爲你會看到性能的顯着提高。

我會解決你對儲蓄的關注,但我真的不明白你想要做什麼。也許你可以多告訴我們一些,並重申它是一個真正的問題。

+1

謝謝你,讓我以不同的方式思考問題,解決方案非常簡單。我改變了ObjectDetailData * newDetailData = [[ObjectDetailData alloc] init]; ObjectDetailData * newDetailData = [controllerDetailDataArray newObject];它的作品就像[contollerDetailDataArray addObjects:newDetailData]的魅力; ...雅虎! – SBeckett

2

我並不確定我是否理解您的設置,但是在我看來,您並未正確使用Core Data中的陣列控制器。如果您使用核心數據,則不必直接將對象添加到控制器。

您應該可以直接將新對象添加到核心數據對象圖中(只需插入它們),並讓控制器自動拾取它們存在的內容。相反,控制器也應該知道刪除或更新。

控制器將觀察覈心數據上下文並自動響應其中的更改。這就是綁定的工作原理,以及爲什麼你可以編寫幾乎沒有代碼的整個應用程序。

+0

使用CoreData比使用AddObjects更好嗎? – tofutim