如何处理Web服务和数据模型/控制器

时间:2013-02-16 13:47:12

标签: ios web-services soap model

我正在使用SOAP和wsdl2objc生成的代码。我有多个视图控制器需要共享Web服务提供的数据。我想有一个数据模型部分,但我很难看到如何处理这个。当然,呼叫应该是异步的。我的问题是,最佳做法是什么?谁应该负责获取数据?谁应该存储数据?如何处理并发?任何想法都将不胜感激!

更新: 我正在考虑使用CoreData,但不确定数据经常更新时的好处是什么。我最大的问题是如何处理视图控制器从模型请求数据但没有数据可用的情况。这意味着执行慢速Web服务调用,并在数据进入时以某种方式通知视图控制器。通知中心是否可以到达此处?流量怎么样?视图控制器是否应该不断监听更新通知?我的想法是,视图控制器注册为观察者,使用模型中的数据填充视图(无论空数据如何),并自动更新收到的通知,即从模型中获取现在具有“最新”数据的数据可用。这使得所有网络呼叫都离开视图控制器,允许视图控制器访问共享数据。想法?

2 个答案:

答案 0 :(得分:3)

在您更新的问题中,是的,我认为通知中心是后台网络任务在新数据可用时更新视图控制器的完美方式。

你问:

  

视图控制器是否一直在监听更新通知?

排序。术语"不断倾听"可能意味着它不断检查更新。显然,它并没有真正做到这一点(或者更重要的是,你不希望它这样做)。相反,它只是将自己注册为该通知的观察者(并确保当视图被解除时,它也会自动注销)。这样,它会通知您任何自定义通知,但它不会浪费大量CPU周期并且不断倾听"。

然后你跟进并问:

  

我的想法是,视图控制器注册为观察者,使用模型中的数据填充视图(无论空数据如何),并自动更新收到的通知,即从模型中获取现在具有&的数据#34;最新"数据可用。这使得所有网络呼叫都离开视图控制器,允许视图控制器访问共享数据。想法?

基本上,是的,听起来不错。我对此的唯一细微改进是,我会在将应用程序发布到商店时使用数据当前预先填充应用程序数据库。这样,当应用程序检索最新数据时,用户可以查看某些内容。也许这在你的场景中无效,但通常最好向用户展示一些东西(即使有点过时),而不是什么,而应用程序检索最新和最好的。

最后(你可能已经在考虑这个了),我确保向用户提供一些可视指示,表明数据正在后台下载。也许是一个位置很好的UIActivityIndicatorView(即一个微调)或UIProgressView。如果您正在处理tableviews,可能会更新UIRefreshControl的文本以说明正在进行下载。也许还会更新状态栏中的网络活动指示器。


我确信每个人都有自己的方法,但是这里有一些观察我在应用程序中做了什么,数据检索过程很复杂,完全异步发生,并且应用程序可以在下载时正常进行/处理正在进行中:

  1. 除了标准的模型,视图和视图控制器类之外,我还有一个单独的" xml控制器"它做了下载和解析结果。我让它以异步方式启动下载。

  2. 为了方便xml控制器和视图控制器之间的通信,我使用了通知。这样,xml控制器将发布有关下载/解析过程的开始和完成特定阶段的通知。如果在更新过程中它们不可靠,则视图控制器可以选择在开始时呈现微调器,和/或仅在完成特定下载/解析阶段时刷新它们自己。必须注意真正识别所有应用程序层并发问题。在每个步骤中,您必须处理&#34的逻辑场景;如果在后台队列中更改了此模型数据"该怎么办?

    最重要的是,在进行异步更新时,防御性编程是当天的规则。你根本无法做出假设,只是因为你最近检索到的东西,即使以后也有效。我们在代码中愉快地做出的许多假设不再成立。我对基于某些索引(例如"第5项")的任何操作也更加谨慎,并且肯定倾向于基于键的操作(例如,具有唯一标识符4027&的"项目#34;。)

  3. 就数据库层并发问题而言,它取决于持久存储的性质。如果您正在使用核心数据,请查看WWDC 2012 - 214 Best Practices with Core Data,其中讨论了并发性。或者参见核心数据编程指南中的Concurrency with Core Data如果使用SQLite,一个简单的解决方案是为数据库操作设置专用的串行队列,例如FMDB's {{1} }。顺便说一句,如果您使用后一种方法,您将需要确保将数据库交互分解为尽可能小的操作,以避免占用数据库。

  4. 如果您想让用户随时了解异步下载/更新过程的进度,您可能需要考虑一下您的框架。有些应用程序可以像状态栏中的网络活动指示器一样简单。其他人在某些公共导航栏中更新了一些状态消息。我还使用自定义容器进行通知,因此我无需添加"显示用户状态更新"在每个视图控制器中。这里有一堆方法,但您应该避免使用需要在每个视图控制器中包含状态更新代码的解决方案(显然,如果视图控制器依赖于后台队列修改的当前项,在哪种情况下,它不是状态更新问题,而是应用程序流问题。)

答案 1 :(得分:0)

由于SOAP信封开销,直接从iOS应用程序中使用SOAP并不是最佳选择。我建议改用REST XML / JSON服务。

如果您没有JSON / XML服务,您可以使用后端移动平台来处理后端的复杂SOAP协议,让您在正面使用轻量级,易于处理的REST / JSON。

一些“企业的开源移动应用程序开发平台”确实提供这些类型的服务。