iPhone - 视图控制器和网络请求的架构

10

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

我正在考虑在哪里放置所有与网络相关的代码,是放在我的UIViewControllers中,从那里开始所有的网络请求,还是放在另一层中。

我想到的是这样的:

有一个名为NetworkManager的层。 NetworkManager是所有Web服务调用的单例。

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

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

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

1. 有另一个层,它在视图控制器和网络管理器之间分隔。 让我们称其为MediatorMediator从networkManager获取字典(JSON)请求,根据应用程序逻辑决定是否还有其他事情需要完成,然后发布具有适当名称和数据的通知。如果中介保存了发出请求的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. 不使用三层架构,而是直接在MyUiViewControllers中使用块发出网络请求。这意味着不需要中介拦截响应,而是让MyUiViewController使用块来处理响应,因为他是发出请求的人。

Pros:
Simple and quick to code
Easy to understand

Cons:
Coupling of network code inside your controllers

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

2个回答

1
我建议选择第二个选项,并加入第一个选项中列出的一些内容。在我的应用程序中,我倾向于同时运行两种不同的操作模式。 自动下载: 应用程序的基本数据被下载并直接保存到数据库中。每次应用程序变为活动状态时,它都会被启动。当每个请求完成时,将发送一个NSNotification,以通知任何可能需要了解新数据的可见视图控制器。
例如,如果我保存了玩家数据,我会发送一个名为“PlayerDataUpdated”的通知。当一个视图控制器可见时,它会监听通知。当它不可见时,它不会监听通知,因为任何对数据库的更改都将在viewWillAppear期间被发现。 用户发起的下载: 对于用户发起的网络请求,如下拉刷新,您应该从需要更新数据的视图控制器中调用NetworkManager的相应方法。

1

你已经找到最好的方法了吗?

通常我会这样做:

创建一个非单例的NetworkManager。定义一个协议,其中包含OnSuccess和OnError方法。在ViewController中实现该协议,并启动网络连接。将代理设置为NetworkManager,并在异步请求执行时调用代理。

使用代理而不是块,因为它更易于维护。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接