我应该在哪里声明一个包含500个对象的数组?

时间:2014-03-11 05:40:59

标签: ios objective-c arrays large-data

我正在开发一个包含大约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个生物,直到我找到应该存储这些信息的位置和方式。

6 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

你肯定应该在CoreData中这样做 - 如果你以前从未这样做,这是一个相当学习的曲线。 Ray Wenderlich一如既往地是一个开始使用它的好地方但是如果你真的想要在某个类的某个地方声明一个数组,我建议实际上为数组创建一个完全独立的类,而不仅仅是把它放在其他地方你的观点。

您还可以查看属性列表(这可能是最简单的选项),尤其是在您启动应用程序后不必修改数据时。这是执行this

的一个很好的演练

答案 2 :(得分:0)

效率非常低,您很难维护代码。

我会将所有属性放在一个文件中(.plist,csv,text,数据库,无论你想要什么),并让你的类读取这个文件并为每个项实例化CreatureObject 在文件中找到(其中item取决于您的文件,例如在csv上,项目将是文件中的一行)。

在伪代码中

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

答案 3 :(得分:0)

数组中的500个对象,每个对象具有6个属性非常大。数组用于处理集合。

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

答案 4 :(得分:0)

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

如果无法访问S3容器,则应始终在iOS项目中包含默认值。抓取CSV文件后,将其保留在CoreData中。让应用程序定期检查S3是否有任何更改。

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

祝你好运!

答案 5 :(得分:0)

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

在其各种优点(可读性,易于扩展的数据结构)中,它允许您轻松地从嵌入式解决方案中进行更改" (应用程序内的数据)到#34;远程解决方案" (从服务器下载的数据)。

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
}