【问题标题】:Should I call my API from my model or controller?我应该从我的模型或控制器调用我的 API 吗?
【发布时间】:2014-06-11 22:06:34
【问题描述】:

我的问题主要与 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 服务的调用?

根据您的经验,需要哪种方法?还是有其他方法?

【问题讨论】:

  • 只是吹毛求疵:NSObject 不是 ObjectiveC 的一部分;它是使用 ObjectiveC 的最著名框架 NextStep/Cocoa 的一部分。然而,这个问题并不是真正的 ObjectiveC 或 Cocoa 特定的。

标签: ios objective-c design-patterns


【解决方案1】:

我会在模型内完成所有的联网工作。以下是所有部分如何组合在一起的大纲

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

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

【讨论】:

  • 这是有道理的。谢谢你。一个稍微在这个问题范围内的额外说明......您建议使用NSNotificationCenter 作为通知视图控制器的一种方式。在这种情况下,您认为这种方法比委托或完成块更受欢迎吗?
  • 使用NSNotificationCenter 是官方认可的方式,模型可以通知应用程序的其他部分发生了变化。理论上,您的应用程序中的任意数量的对象都可以监听来自模型的通知。例如,在 iPad 上的拆分视图控制器中,主视图控制器和详细视图控制器都可以监听模型更新。但仅仅因为这是官方方式,并不意味着它是完成工作的唯一方式。
  • 非常好,谢谢。我相信我的应用程序中需要这两种方法。特定控制器交互的完成块和广播消息的NSNotificationCenter,独立于应用程序状态。
【解决方案2】:

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

您的模型类应该隐藏数据库访问并提供简单的接口,例如使用addNewFollower 方法。然后,此方法应(可选地进行完整性检查)并将其持久化到数据库后端。

这种方法可以让您轻松替换数据库集成,而无需触及服务层。例如使用内存中的模拟数据库进行测试。

【讨论】:

    【解决方案3】:

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

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

    另一件事是,某些端点并不总是完全按照您在所有代码中硬塞的模型中定义的那样返回数据。

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

    【讨论】:

      猜你喜欢
      • 2011-06-03
      • 1970-01-01
      • 1970-01-01
      • 2016-08-18
      • 2016-03-24
      • 1970-01-01
      • 2012-04-29
      • 1970-01-01
      • 2020-03-15
      相关资源
      最近更新 更多