iPhone - Architecture for viewController and network requests
所以,我有两种类型的数据,有些需要持久化,有些不需要。
我正在考虑将所有与网络相关的代码放在哪里,在uiviewcontrollers中,从哪里开始所有网络请求,或者放在另一个层中。
我想到的是:
有一个称为
对于需要持久化并且可以在列表中显示的数据,我会让网络管理器发出请求,将响应保存在本地核心数据数据库中,并让我的
但是,还有许多其他类型的请求。例如:登录请求、用户信息请求、FriendsNearby等等……有些不需要在我的数据库中持久化,有些不适合FRC体系结构。
对于这些类型的请求,据我所见,有两种处理方法:
1。在视图控制器和NetworkManager之间有另一个层。我们称之为
流程如下:
1 2 3 4 5 6 7 8 9 | 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,用块发出网络请求。这意味着,不要让中介在myuiviewcontroller之前拦截响应,只要让myuiviewcontroller使用块处理响应,因为他是发出响应的人。
1 2 3 4 5 6 | Pros: Simple and quick to code Easy to understand Cons: Coupling of network code inside your controllers |
我希望能从人们的经验中得到最好的建议和评论,或者其他更好的方法。
我建议使用选项2,其中包含一些您为选项1列出的内容。在我的应用程序中,我倾向于有两种不同的并发操作模式。
自动下载:应用程序基本数据直接下载并保存到数据库中。它会在应用程序每次激活时启动。当每个请求完成时,会向可能需要了解新数据的任何可见视图控制器发送一个nsnotification。
例如,如果我保存播放器数据,我会发送一个类似"playerdautupdated"的通知。当视图控制器可见时,它监听通知。当它不可见时,它不会监听通知,因为在查看期间会发现对数据库的任何更改。
用户启动的下载:对于用户发起的网络请求(如"拉到刷新"),您应该从需要更新数据的视图控制器中调用NetworkManager上的适当方法。
你已经有什么最好的方法了吗?
这是我通常做的,
有一个不是singleton的NetworkManager。使用方法OnSuccess、OnError定义协议。在启动网络连接的ViewController中实现此功能。在NetworkManager上设置委托,并在执行异步请求时调用委托。
使用委托而不是块作为易于维护的工具。
这可能不是最好的解决方案,但希望它能给您一些提示。