关于C#:iPhone – 用于viewController和网络请求的架构

iPhone - Architecture for viewController and network requests

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

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

我想到的是:

有一个称为NetworkManager的层。对于我所有的网络服务呼叫,NetworkManager都是singerlton。

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

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

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

1。在视图控制器和NetworkManager之间有另一个层。我们称之为MediatorMediator从networkmanager获取字典(json)请求,根据应用程序逻辑决定是否需要对其执行其他操作,然后使用适当的名称和数据发布通知。如果中介保存发出请求的uiviewcontroller,它可以将响应直接委托给他,而不是发布通知。

流程如下:

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上设置委托,并在执行异步请求时调用委托。

使用委托而不是块作为易于维护的工具。

这可能不是最好的解决方案,但希望它能给您一些提示。