【问题标题】:Where should I declare an array containing 500 objects?我应该在哪里声明一个包含 500 个对象的数组?
【发布时间】:2014-04-14 13:37:54
【问题描述】:

我正在开展一个项目,该项目将包含大约 500 种不同的生物。每个生物都有 6 种不同的属性,例如名称、年龄、速度等。

我意识到我将花费大量时间为每个生物写出每个属性,但我不确定是否有更合适(和有效)的地方来存储这么多信息。起初,我开始在 viewDidLoad 方法中编写数组的一些示例,但我认为如果我在单独的头文件中单独声明数组可能会更有条理。那可能吗?

creatureList = [NSMutableArray arrayWithCapacity:25];

Creature *creature = [[Creature alloc] init];
creature.name = @"Edward";
creature.age = 24;
creature.gender = @"Male";
creature.attack = 75;
creature.defense = 50;
creature.speed = 90;

creature = [[CreatureObject alloc] init];
creature.name = @"Bruno";
creature.age = 39;
creature.gender = @"Male";
creature.attack = 60;
creature.defense = 100;
creature.speed = 75;
[creatureList addObject:creature];

...等等。我现在将数组限制为 25 个生物,直到我找出这些信息应该存储在哪里以及如何存储。

【问题讨论】:

  • 使用 plist 文件或数据库。

标签: ios objective-c arrays large-data


【解决方案1】:

显然,我不了解您项目的全部范围,但处理此类结构化数据的最合适方法是将其存储在易于维护且不会硬编码到您的应用中的数据库中。您可以使用本地数据库(Core Data,甚至只是结构化文本文件)或远程数据库(mysql、mongodb 等),它们可以在运行时动态加载您的生物列表(或在需要时懒惰地加载)。

【讨论】:

    【解决方案2】:

    您绝对应该在 CoreData 中执行此操作 - 如果您以前从未这样做过,这将是一个相当长的学习曲线。 Ray Wenderlich 一如既往是开始使用它的好地方,但如果你真的想在某个类中声明一个数组,我建议实际上为数组创建一个完全单独的类,而不仅仅是把它放在其他地方你的看法。

    您还可以查看属性列表(这可能是最简单的选择),尤其是在应用启动后无需修改数据的情况下。这是一个很好的演练this

    【讨论】:

    • 谢谢。我还是新手,还不熟悉 CoreData 或 plist,但我认为这就是我所需要的。我会检查这些链接。
    【解决方案3】:

    这是非常低效的,您将很难维护您的代码。

    我会将所有属性放在一个文件中(一个 .plist、一个 csv、文本、数据库,任何你想要的),并让你的班级读取这个文件并为每个 项目实例化一个 CreatureObject em> 在文件中找到(其中项目取决于您的文件,例如在 csv 中,项目将是文件中的一行)。

    在伪代码中

    open config file
    for (each line in file)
    {
         Creature x = parse line
         arrayofCreatures addObject:x
    } 
    

    【讨论】:

      【解决方案4】:

      一个数组中有 500 个对象,每个对象有 6 个属性并不会很大。数组是用来处理集合的。

      如果你想要持久数据,那么毫无疑问你可以使用 CoreData、SQLite、数据库,甚至你可以形成一个 plist 来存储数组。

      【讨论】:

        【解决方案5】:

        如果我是你,我会将所有这些数据放在电子表格中,然后将其导出为 CSV 文件。也许将其放入 S3 以便即时下载。这样您就可以在不更新代码的情况下调整和调整您的生物属性(前提是您的用户已通过 Wi-Fi/蜂窝网络连接)。

        您应该始终在您的 iOS 项目中包含一个默认值,以防 S3 容器无法访问。获取 CSV 文件后,将其保存在 CoreData 中。让应用定期检查 S3 是否有任何更改。

        要处理 CSV 文件,请使用 Dave Delong 的 CHCSVParser

        祝你好运!

        【讨论】:

          【解决方案6】:

          在我看来,处理像你这样的数据最简单、最方便的方法是拥有一个描述你所有生物的 JSON 文件。

          在它的各种好处(可读性、易于扩展的数据结构)中,它允许您轻松地从“嵌入式解决方案”(应用内的数据)更改为“远程解决方案”(从服务器下载的数据)。

          在 Swift 中加载 JSON 的示例:

          var creatures = [Creature]()
          
          do {
          
             let url = URL(fileURLWithPath: filepath)
             let data = try Data(contentsOf: url)
             let jsonObject = try JSONSerialization.jsonObject(with: data, options: .allowFragments)
          
             creatures = (jsonObject as? [[String: Any]]).flatMap({ Creature(dictionary: $0) })
          
          } catch let exc {
          
             print(exc)
             return
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-11-17
            • 1970-01-01
            • 2020-05-15
            • 1970-01-01
            • 2021-04-02
            • 2021-02-28
            相关资源
            最近更新 更多