【问题标题】:App structure for storing large quantity of records用于存储大量记录的应用程序结构
【发布时间】:2012-10-09 10:39:00
【问题描述】:

我正在创建一个处理房地产列表的 iOS 应用。目前的结构如下:

  1. 设备联系服务器并下载一个索引文件,其中包含服务器上所有当前记录的 ID 以及每条记录的最后修改时间。

  2. 根据索引文件检查设备上的每个核心数据记录,并且: a) 记录是最新的,没有任何反应。 b) 记录已过期,从设备中删除并从服务器重新加载。 c) 记录不是索引文件的一部分,会从设备中删除。 d) 在具有列表 ID 的设备上未找到任何记录,并从服务器下载。

我使用索引文件是因为我只需下载每条记录的一小部分数据以便进行比较。

我的问题是这样的,我目前在服务器上大约有 1250 条测试记录。使用当前设置,完成初始索引检查例程大约需要 3 分钟(使用 WiFi)。必须有更好的方法来处理 iOS 应用程序中的大量记录。尝试预先加载核心数据中的所有记录我错了吗?

作为参考,我包括了 ListingRecord.h

@property (nonatomic, retain) NSString * amenitiesText;
@property (nonatomic, retain) NSString * bodyLabel1;
@property (nonatomic, retain) NSString * bodyLabel2;
@property (nonatomic, retain) NSString * bodyLabel3;
@property (nonatomic, retain) NSString * brokerID;
@property (nonatomic, retain) NSString * companyID;
@property (nonatomic, retain) NSDate * dateCreated;
@property (nonatomic, retain) NSString * descriptionText;
@property (nonatomic, retain) NSString * displayPrice;
@property (nonatomic, retain) NSString * featuredListing;
@property (nonatomic, retain) NSString * headerLabel;
@property (nonatomic, retain) NSData * headerPhoto;
@property (nonatomic, retain) NSString * lastUpdate;
@property (nonatomic, retain) NSNumber * latitudeData;
@property (nonatomic, retain) NSNumber * listingID;
@property (nonatomic, retain) NSString * listingType1;
@property (nonatomic, retain) NSString * listingType2;
@property (nonatomic, retain) NSString * listingType3;
@property (nonatomic, retain) NSString * listingType4;
@property (nonatomic, retain) NSString * listingType5;
@property (nonatomic, retain) NSString * listingType6;
@property (nonatomic, retain) NSString * listingType7;
@property (nonatomic, retain) NSString * listingType8;
@property (nonatomic, retain) NSNumber * longitudeData;
@property (nonatomic, retain) NSNumber * numberPrice;
@property (nonatomic, retain) NSData * photo1;
@property (nonatomic, retain) NSData * photo2;
@property (nonatomic, retain) NSData * photo3;
@property (nonatomic, retain) NSData * photo4;
@property (nonatomic, retain) NSData * photo5;
@property (nonatomic, retain) NSString * pinLabel;
@property (nonatomic, retain) NSData * thumbnailPic;
@property (nonatomic, retain) NSString * sessionID;

索引文件包含listingID和lastUpdate,并将它们与设备上的核心数据记录进行比较。

【问题讨论】:

  • 如果您向我们展示您是如何进行初始索引检查例程的,这将很有帮助。
  • 列表文件是什么格式的?例如XML?你有没有想过返回一个 JSON 对象来表示索引?它可能会加快速度。
  • @sosborn - 我执行 NSURLRequest 来获取 XML 文件,然后执行 NSXMLParser 来获取数据。您想了解更多详情吗?
  • @bennythemink - 对 JSON 不太熟悉,但它在大小上会不会与 XML 大致相同,并且与核心数据记录的比较需要大约相同的时间?
  • @sangony- 是的,我正在寻找您如何进行比较。这可能是你最大的瓶颈。

标签: iphone ios networking core-data data-structures


【解决方案1】:

似乎有两个瓶颈,与服务器的通信和检查例程。为了帮助解决第一个瓶颈,我强烈推荐 JSON,如果使用得当,它应该会减少从服务器传递到设备的数据大小,并且非常易于使用。它还应该有助于解决第二个瓶颈,即检查例程,因为您只需从服务器获取返回的数据,使用一行代码将其转换为 JSON 对象表示,然后您基本上是在处理一个 NSDictionary 值。

【讨论】:

  • 你是建议我只为索引文件或整个包(可以这么说)使用 JSON 并完全删除 XMLParser?您认为我想要预先加载所有内容的方法是正确的,还是应该在用户选择方法时进行加载?
  • 这完全取决于您的情况以及您需要重新设计多少代码。如果我是你,我会先测试从服务器将索引作为 JSON 数据传递需要多长时间。如果您认为它在可接受的时间范围内,则一次全部加载,否则将其分成更小的卡盘并根据用户选择加载。
  • 另外,如果包的其余部分的下载速度很快,那么可能只是将其保留为基于 XML 并仅将 JSON 用于索引。再次完全取决于需要多少重新设计。我更喜欢将它全部作为 JSON,但如果它是一项主要的转换工作并且对用户没有显着的速度提升,那么它可能不值得。
  • 好的。这更像是一个学习项目,所以我将使用所有 JSON 并看看会发生什么。最后一点,目前我设置了每次下载新的索引文件时,新的“会话 ID”是该文件的一部分。然后,我遍历所有核心数据文件,进行检查,并将新的会话 ID 写入每个核心数据记录。我这样做是为了知道任何没有会话 ID 的记录都不是索引文件的一部分,必须删除。这让我觉得有点倒退,但我想不出别的办法。有什么建议吗?
  • 没有什么可以想到的,恐怕是 sangony。您的逻辑很好,可能有更好的解决方案,但我目前想不出任何抱歉。另外 user523234 下面的建议是一个很好的建议。如果你的 UI 不完全依赖于来自服务器的信息,那么在一个单独的线程中进行处理,同时让用户浏览应用程序是个好主意。
【解决方案2】:

如果您需要一次完成所有这些,我会安排您的流程逻辑,以便您可以在后台线程中执行此“初始索引检查例程”。

另一种选择是将索引文件发送到服务器并让您的后端服务器完成工作,它只返回用于添加、删除、更新等的列表。这取决于您的后端服务器是否能够执行此操作.

【讨论】:

  • 你的观点非常好,但我没有考虑过。我使用 4D 服务器 (4d.com) 作为我的后端数据库。不确定您的建议是否可以完成,但一旦列表达到 10,000 大关,这可能是唯一可行的方法。
猜你喜欢
  • 2010-09-27
  • 2010-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-07
  • 2013-06-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多