簡體   English   中英

在iOS應用程序中存儲靜態數據的最佳方法是什么?

[英]What's the best way to store static data in an iOS app?

我在我的應用程序中有大量需要訪問的數據,但應用程序永遠不會更改。 目前我在JSON文件和SQL數據庫中的其他應用程序中使用此數據,但在iOS中使用它們似乎都不是很簡單。

我不想使用CoreData,它提供了大量不必要的功能和復雜性。

將數據存儲在PropertyList文件中並構建一個存取器類是一個好主意嗎? 是否有任何簡單的方法可以在不使用CoreData路由的情況下合並SQLite?

如果數據量相對較小,則只能使用plist。 Plist完全加載到內存中,因此只有在您需要的時候,如果您可以在內存中同時維護plist創建的所有對象,您才能真正使用它們。

核心數據具有學習曲線,但在使用中它通常不如SQL復雜。 在大多數情況下,“更簡單”的SQL會導致更多編碼,因為您最終必須復制Core Data的大部分功能,以便將過程SQL強加到面向對象的API中。 您必須通過跟蹤保留來手動管理所有數據的內存使用。 每次需要數據時都會編寫很多SQL代碼。 我已經將SQL中的幾個應用程序更新為Core Data,並且在所有情況下,Core Data實現都比SQL更小,更清晰。

內存或處理器的“開銷”都不大。 核心數據經過高度優化。 在大多數情況下,現成的Core Data比手動調整的SQL更有效。 SQL中的一個次要子優化通常會破壞它可能具有的任何理論優勢。

當然,如果您已經非常熟練地使用C語言管理SQL,那么您個人可能會通過使用SQL來更快地將應用程序推向市場。 但是,如果你想知道你應該計划在Apple平台上使用什么,核心數據幾乎總是答案,你應該花時間去學習它。

您可以直接使用SQLite,而無需使用SQLite C API的Core Data開銷。

是我在您的用例中找到的教程 - 只需從SQLite數據庫加載一些數據。 希望這可以幫助。

根據數據類型,大小和更改頻率,您可能希望保持簡單並使用屬性列表。 否則,使用SQLite(在Jergason的答案中記錄)將是我要去的地方。 雖然讓我說如果你有一個相對較小(不到幾百)的基本類型(數組,字典,數字,字符串)不經常更改,那么在我看來屬性列表將是一個更好的選擇。

作為一個例子,在我的一個游戲中,我根據每個難度從單個屬性列表創建級別。 由於每個難度只有少數幾個級別(99)和每個級別的一小組參數(游戲中的元素數量,它們的初始位置,質量等)然后它是有道理的,我避免直接​​處理SQLite或者更糟糕的是,設置和維護CoreData。

“最好的”是什么意思? 什么樣的數據?

如果它是一堆對象,那么JSON或(二進制)plist並不是可怕的格式,因為你需要在內存中加載整個東西來遍歷對象圖。 比較空間效率和裝載性能以選擇使用哪一個。

如果它是一堆二進制blob,則將blob存儲在一個大文件中,內存映射文件(NSDataReadingMapped又名NSMappedRead),並將索引用於blob。 iOS框架使用這些的混合(例如,有很多.png,但也包含“other.artwork”,它只包含原始圖像數據)。

如果你的類實現了NSCoding協議,你也可以使用NSKeyedArchiver和朋友,但是有一些對象圖管理開銷,它產生的plist格式並不是很好用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM