iPhone - viewController 和网络请求的架构
Posted
技术标签:
【中文标题】iPhone - viewController 和网络请求的架构【英文标题】:iPhone - Architecture for viewController and network requests 【发布时间】:2012-04-14 20:25:17 【问题描述】:所以,我有两种类型的数据,有些需要持久化,有些不需要。
我正在考虑将所有与网络相关的代码放在哪里,放在我的 UIViewControllers 中,所有网络请求都从哪里开始,或者放在另一个层中。
我的想法是这样的:
有一个名为NetworkManager
的层。
NetworkManager
是我所有网络服务调用的歌手。
对于需要持久化并且可以在列表中显示的数据,我会让网络管理员发出请求,将响应保存在我的本地核心数据数据库中,并让我的 UIViewController
使用 @987654324 收听该数据@。
但是,还有许多其他类型的请求。例如:登录请求、用户信息请求、friendsNearBy 等等……有些不必在我的数据库中持久化,有些则不适合 FRC 架构。
对于这类请求,据我所知,有两种处理方式:
1. 在 ViewControllers 和 NetworkManager 之间有另一个层。
我们称之为Mediator
。 Mediator
从 networkManager 获取字典(JSON)请求,根据应用程序逻辑决定是否需要对其执行其他操作,然后发布带有适当名称和数据的通知。如果 mediator 保存了发出请求的 UIViewController,它可以直接将响应委托给他,而不是发布通知。
流程是这样的:
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,发出带有块的网络请求。这意味着不是 Mediator 在 MyUiViewController 之前拦截响应,而是让 MyUiViewController 使用块来处理响应,因为他是发出它的那个。
Pros:
Simple and quick to code
Easy to understand
Cons:
Coupling of network code inside your controllers
我希望从人们的经验中获得最好的建议和建议,或者其他/更好的方法。
【问题讨论】:
【参考方案1】:你已经找到最好的方法了吗?
这是我通常做的,
有一个不是 Singleton 的 NetworkManager。使用方法 OnSuccess,OnError 定义协议。在启动网络连接的 ViewController 中实现这一点。在 NetworkManager 上设置委托,在执行异步请求时调用委托。
使用委托而不是块,因为它易于维护。
这可能不是最好的解决方案,但希望它能给你一些指导。
【讨论】:
【参考方案2】:我推荐选项 2 以及您为选项 1 列出的一些内容。在我的应用程序中,我倾向于同时运行两种不同的操作模式。
自动下载: 应用程序基本数据被下载并直接保存到数据库中。每次应用程序激活时都会启动它。当每个请求完成时,会为可能需要了解新数据的任何可见视图控制器发送一个 NSNotification。
例如,如果我保存玩家数据,我会发送类似“PlayerDataUpdated”的通知。当视图控制器可见时,它会监听通知。当它不可见时,它不会监听通知,因为在 viewWillAppear 期间会发现对数据库的任何更改。
用户发起的下载: 对于用户发起的网络请求,例如拉取刷新,您应该从需要更新数据的视图控制器调用 NetworkManager 上的相应方法。
【讨论】:
以上是关于iPhone - viewController 和网络请求的架构的主要内容,如果未能解决你的问题,请参考以下文章
关于使用多态显示 iPhone/iPad ViewControllers
我应该在哪里创建和呈现整个 iPhone 应用程序中使用的模态 ViewController
iPhone - 设计我自己的 viewController 过渡
如何在 iPhone sdk 中从 ViewController 绘制一个矩形