所以,我有两种类型的数据,一些需要持久化,一些不需要。
我正在考虑将我所有与网络相关的代码放在哪里,在我的 UIViewController 中,所有网络请求从哪里开始,或者在另一层。
我的想法是:
有一个名为 NetworkManager
的层。
NetworkManager
负责我所有的网络服务调用。
对于需要持久化并可以在列表中呈现的数据,我会让网络管理器发出请求,将响应保存在我的本地核心数据数据库中,并让我的 UIViewController
监听该数据使用 FetchResultsController
。
但是,还有许多其他类型的请求。例如:登录请求、用户信息请求、friendsNearBy 等等……有些不必在我的数据库中持久化,有些不适合 FRC 架构。
对于这些类型的请求,据我所知,有两种处理方式:
1. 有另一个层将 ViewController 和 NetworkManager 分开。
我们称它为 Mediator
。 Mediator
从 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/