iPhone - viewController 和网络请求的架构

标签 iphone objective-c ios model-view-controller networking

所以,我有两种类型的数据,一些需要持久化,一些不需要。

我正在考虑将我所有与网络相关的代码放在哪里,在我的 UIViewController 中,所有网络请求从哪里开始,或者在另一层。

我的想法是:

有一个名为 NetworkManager 的层。 NetworkManager 负责我所有的网络服务调用。

对于需要持久化并可以在列表中呈现的数据,我会让网络管理器发出请求,将响应保存在我的本地核心数据数据库中,并让我的 UIViewController 监听该数据使用 FetchResultsController

但是,还有许多其他类型的请求。例如:登录请求、用户信息请求、friendsNearBy 等等……有些不必在我的数据库中持久化,有些不适合 FRC 架构。

对于这些类型的请求,据我所知,有两种处理方式:

1. 有另一个层将 ViewController 和 NetworkManager 分开。 我们称它为 MediatorMediator 从 networkManager 获取字典 (JSON) 请求,根据应用程序逻辑决定是否需要对其进行任何其他处理,然后发布具有适当名称和数据的通知。如果中介保存了发出请求的 UIViewController,它可以直接将响应委托(delegate)给他而不是发布通知。

流程是这样的:

MyUiViewController - > Mediator -> NetworkManger->Mediator-> PostNotification (or directly back to MyUiViewController)

Pros:
Decoupling
Nice structure and separation of concerns

Cons:
Harder to code
Sometimes harder to understand and debug.

2. 没有这个 3 层架构,而是有 MyUiViewControllers,使用 block 发出网络请求。这意味着不是 Mediator 在 MyUiViewController 之前拦截响应,而是让 MyUiViewController 使用 block 处理响应,因为他是发出它的那个。

Pros:
Simple and quick to code
Easy to understand

Cons:
Coupling of network code inside your controllers

我希望从人们的经验中得到最好的建议和评论,或者其他/更好的方法。

最佳答案

你知道什么是最好的方法了吗?

这是我通常做的,

有一个不是单例的 NetworkManager。使用方法 OnSuccess,OnError 定义一个协议(protocol)。在启动网络连接的 ViewController 中实现它。在 NetworkManager 上设置委托(delegate),让委托(delegate)在执行异步请求时被调用。

使用委托(delegate)代替 block ,因为它易于维护。

这可能不是最佳解决方案,但希望它能给您一些指导。

关于iPhone - viewController 和网络请求的架构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9955041/

相关文章:

iphone - UISearchBar 键盘外观

iphone - 如何使用 fb ://url 从其他应用程序打开 iphone fb 应用程序中的照片

ios - 本地化 ios 应用程序以支持多语言时出错

objective-c - 如何在 Objective-c/Cocoa (OSX) 中做出完美的裁剪(不改变质量)

objective-c - UITabBarController 应用程序 - 如何在 Controller 之间调用方法?

ios - UIViewControllerAnimatedTransitioning 在 iPhone X 上插入安全区域

iphone - 表情符号将我的键盘更改为...

ios - 无法从 UIViewController 导航到 UICollectionViewController

ios - iPhone日期格式

ios - 如何在 iPhone 上使用 OpenGL ES 绘制实心圆?