2009-08-12 64 views
0

我正在開發一個應用程序在可可中。我需要解析一個大尺寸的iTunes XML文件(大約25Mb)。我現在使用下面的代碼片段 NSDictionary * itunesDatabase = [NSDictionary dictionaryWithContentsOfFile:itunesPath ]。 但是這有點慢 有沒有更快的方法來加載整個數據到字典?在可可中的iTunes XML解析

+0

你真的需要,使這個速度更快,或者是問題多的是,主線程在文件加載時被阻塞? – 2011-02-13 17:43:27

回答

0

如果您能夠使用第三方框架,請運行,不要步行到EyeTunes。 (BSD許可證)。它是Apple Events與iTunes通信的抽象層,因此它不直接解析XML數據庫(我認爲,自從我使用它以來已經有一段時間了),但是您將擁有獲取/設置訪問XML中的任何內容。

+1

如果使用的是蘋果事件,則iTunes必須運行才能使用它。 – 2011-02-13 17:42:11

3

你這樣慢的表現的原因是因爲NSDictionary一次將所有內容全部讀入內存。對於一個大型的iTunes庫,這可能需要很長時間,並且可以隨時通過活動監視器來確認 - 這是一個度量內存分配。 (這是該內存量的精確技術術語)

在這些情況下的替代方法是使用基於回調的XML解析器(通常稱爲「SAX」解析器)。這些解析XML文檔的實體一次,並調用您的回調方法。在Cocoa中,NSXMLParser類提供了這個功能。您將類設置爲其委託,調用parse方法,解析器開始調用委託方法,因爲它讀取XML文件中的標記,屬性,文本等。

現在,這顯然比僅僅將所有內容加載到NSDictionary並漫步生成的對象樹更困難。你需要自己跟蹤狀態信息。而且你必須逐步「建立」你的對象,所以組織你的課程可能很困難。

但是,您可以忽略您不感興趣的XML,並節省大量內存。而且,根據您從iTunes中獲得的數據,只要您獲得所需的數據,您也可以立即結束解析。即使這樣做最終會花費相當長的一段時間,但至少您可以向用戶顯示一個進度條或其他表示程序正在工作的指示,這比掛載10-20秒要好得多,而當加載NSDictionary時一個巨大的XML文件。

+0

請注意,由於'initWithData:'是其指定的初始化程序,因此NSXMLParser仍然一次全部讀入內存。 – 2009-08-13 06:42:42