每次运行应用程序时,我都必须下载新数据

时间:2013-01-21 10:12:28

标签: ios objective-c web-services sqlite core-data

我正在使用最新的SDK和XCode 4.5.2开发iPhone应用程序。

此问题可能适用于任何移动平台。

我需要在app明星和下载一些信息时连接到网络服务。这些信息可能会在服务器上发生变化:某些寄存器可能会被删除,更新或插入。

我的问题是我不知道在哪里存储这些信息。我认为将它存储在设备内存上是一个坏主意。我认为最好存储在文本文件或数据库中。 您的想法是什么?

我还有一个问题是:如何知道服务器上是否有某些数据被更改?我认为每次用户加注应用时都会下载相同的数据。

如果我想这样做,请在显示启动画面时连接到星形向上的Web服务。 我必须在AppDelegate上放置代码吗?

欢迎任何建议。

3 个答案:

答案 0 :(得分:3)

我必须在AppDelegate上放置代码吗?

在AppDelegate中使用代码不是一个好主意。相反,您可以将viewController作为启动画面。将此viewController设置为rootViewController。在此完成您的初始Web服务调用,一旦完成,请转到应用程序的第一个屏幕。

如何知道服务器上是否更改了某些数据?

您必须与服务器通信您的数据版本。因此,在服务器端设置数据的版本号,并在下载数据时跟踪它。因此,如果在调用Web服务时将版本号传递给服务器,则服务器可以决定是否有可用的新数据。这样您就可以避免下载已下载的数据。

存储该信息的位置?

这取决于您要存储的数据大小。而且它的安全性。 我认为使用像Sqlite3这样的数据库是个不错的选择。

希望这有帮助。

答案 1 :(得分:1)

我必须在AppDelegate上放置代码吗?

这取决于您的应用在您决定下载数据的位置的行为。通常,如果您的应用程序每次进入新视图时都应显示最新数据,则应在访问该视图时下载数据。这样,您将始终向用户显示最新的可用数据。

您通常会避免过多地使用应用程序:didFinishLaunchingWithOptions:,特别是网络连接,因为您不知道用户可能具有哪种连接。如果连接花费了很长时间并且应用程序:didFinishLaunchingWithOptions:需要太长时间才能返回iOS会导致您的应用程序因为打开时间太长而无法完成用户体验。< / p>

如何知道服务器上是否更改了某些数据?

您希望在服务器响应的标头中传递最后修改的时间戳或etag。当您从服务器获得标头响应时,您可以检查您收到的上一个最后修改过的数据,或者如果etag不同,您就知道数据已被更改。这样做比下载所有正文以检查单个参数要快得多,如果该参数没有改变那么你刚刚下载了一堆数据。我不鼓励版本控制,版本控制更多地用于API更改,而不是检查数据是否过期。

存储位置?

这取决于您要下载的数据量,但我建议通常使用核心数据。将数据存储到文件然后保存该文件的问题是,每次打开应用程序时,您都必须将数据分解为可用的内容,然后才能搜索它。使用核心数据,您将拥有完全形成的对象您可以使用NSPredicate进行搜索,从长远来看,使一切变得更加简单。

如果您只是下载了一些设置,那么您可以使用类似文件或NSUserDefaults的东西,但如果您要向用户显示列表或数据集合,则最好使用核心数据。

答案 2 :(得分:0)

如何知道服务器上是否更改了某些数据?
在应用程序和服务器中也使用变量版本。使用API​​发送应用程序变量版本并在下载数据之前主持两个版本。

我必须在AppDelegate上放置代码吗?

可以使用applicationDidBecomeActive或didFinishLaunchingWithOptions取决于您的要求
- (void)applicationDidBecomeActive:(UIApplication *)application

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

存储该信息的位置
根据数据的大小和您的要求,您可以决定保存数据的位置

  1. 您可以在 UserDefault
  2. 中保存数据
  3. 您可以将数据保存为 NSTemporaryDirectory / NSDocumentDirectory / NSLibraryDirectory 中的文件。我认为 NSDocumentDirectory 对你没问题。
  4. 您可以在 sqlite CoreData
  5. 中保存数据