我应该从我的模型或控制器调用我的API吗?

时间:2014-06-11 22:06:34

标签: ios objective-c design-patterns

我的问题主要与Objective C中的层次模型的架构或设计模式有关。对于后台我的应用程序相对简单。通常,它与Web服务进行对话,以检索和显示用户可以遵循的内容。当有人关注某事时,他们所关注的事物在概念上存储起来,以便稍后通过发布到Web服务进行访问。

我想了解逻辑应该用于管理Web服务与用户遵循的事物组之间的交互的位置。

例如,是否适合使用名为MyStuffModel的数组属性创建类似followedThings的模型对象,该属性包含对AThingModel个对象的引用?如果是这样,是否可以在模型中编写和执行从Web服务等刷新的逻辑?

潜在的代码示例

@interface MyStuffModel : NSObject

@property (nonatomic, strong) NSArray *followedThings;

- (void)refreshAllFollowedThingsFromWebService;

@end

@implementation MyStuffModel

- (void)refreshAllFollowedThingsFromWebService
{
    //call my API client (built on AFNetworking), get back a response
    //populate followedThings, notify a view controller, etc

}

@end

或者,我是否应该拥有MyStuffModel对象并通过直接从视图控制器调用我的API客户端来管理对我的Web服务的调用?

根据您的经验,需要采用哪种方法?或者还有另一种方式吗?

3 个答案:

答案 0 :(得分:6)

我会在模型中完成所有网络连接。以下是所有部分如何组合在一起的概述

  • 控制器告诉模型要遵循哪些项目
  • 模型将该信息转发给服务器
  • 当服务器有新信息时,它使用APNS通知模型
  • 模型从服务器请求新信息
  • 数据传输完成后,模型使用NSNotificationCenter通知控制器新信息可用
  • 控制器从模型中读取信息
  • 控制器使用新信息更新视图

使用Apple's Push Notification Service(APNS)可让您的服务器在新数据可用时通知您的应用。这有助于减少网络流量,因为您的应用不必经常轮询服务器以确定何时有新数据可用。如果您不熟悉APNS,那么您需要了解该服务的一个非常重要的功能(因为它似乎是许多新用户的混淆点)。该服务仅保证发送最后一条消息。因此,例如,如果服务器为特定设备获取10个新项目,并在设备关闭或在隧道中时向设备发送10个通知,则该服务仅保证提供第10个消息。关键是您无法使用APNS将任何数据从服务器发送到设备,因为某些消息可能会丢失。您应该只使用APNS通知设备数据可用。

答案 1 :(得分:0)

我总是创建模型类(和接口,不知道是否适用于ObjectiveC)。 在许多情况下,该模型是数据库后端的视图。

您的模型类应隐藏数据库访问权限并提供简单的界面,例如使用addNewFollower方法。然后,此方法应该(可选地进行健全性检查)并将其持久保存到数据库后端。

此方法允许您轻松替换数据库集成,而无需触及服务层。例如,使用内存模拟数据库进行测试。

答案 2 :(得分:0)

我总是为模型创建简单的“哑”对象,因为它们对数据进行了建模,仅此而已。如果您要进行网络/ api调用,我将创建一组单独的类,这些类严格处理API调用,并将您的模型用作交换数据。混合数据和功能对我总是很麻烦。

编写一个干净,可重用,可测试和可靠的API客户端,该客户端可以处理错误,并行/串行调用,日志记录等,需要大量的代码,这些代码实际上应该与其他应用程序层分开。数据就是数据,保持数据干净,简单。

另一件事是,某些端点返回的数据并不总是完全符合在那1个模型中定义的所有数据。

我也不会把它放在控制器中,我个人总是创建一组专门用于API调用的不同类,这些类也会抛出自己的异常,处理序列化/反序列化等。