2012-03-31 70 views
10

所以,我有2种类型的数据,有些需要保留,有些则不需要。iPhone - 视图控制器和网络请求的体系结构

我在想在哪里把我所有的网络相关的代码放在我的UIViewControllers里面,所有的网络请求都从其他层开始。

我脑子里想的是这样的:

有一个名为NetworkManager层。 NetworkManager是singerlton我所有的网络服务电话。

对于需要持久,并且可以在列表中呈现,我会网管数据发出请求,保存在我的本地核心数据DB的响应,并有我UIViewController听使用FetchResultsController数据。

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

对于这些类型的请求,据我看到的,有处理它2种方式:

1.具有与ViewControllers和网络管理器之间分离的另一层。 我们称之为MediatorMediator从网络管理器获取字典(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.不具有本3分层架构,而是具有MyUiViewControllers,发出带有区块的网络请求。含义不是Mediator在MyUiViewController之前拦截响应,只是让MyUiViewController使用块处理响应,因为他是发出响应的响应。

Pros: 
Simple and quick to code 
Easy to understand 

Cons: 
Coupling of network code inside your controllers 

我希望能得到关于什么是最好的从人们的经验,或者这样做的其他/更好的方式提出建议和意见。

回答

1

你有什么最好的方法了吗?

这是我一般做,

有一个NetworkManager的是不是单身。用方法OnSuccess,OnError定义一个协议。在启动网络连接的ViewController中实现它。在NetworkManager上设置委托,并在执行异步请求时调用委托。

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

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

1

我推荐选项2,其中包含一些您列出的选项1。在我的应用程序中,我倾向于有两种不同的操作模式同时运行。

自动下载: 应用程序基本数据被下载并直接保存到数据库。每次应用程序激活时,它都会启动。随着每个请求完成,NSNotification将发送给任何可能需要了解新数据的可见视图控制器。

例如,如果我保存玩家数据,我会发送像“PlayerDataUpdated”这样的通知。当视图控制器可见时,它会侦听通知。当它不可见时,它不会侦听通知,因为在viewWillAppear期间将发现对数据库的任何更改。

用户启动下载: 对于用户发起的网络请求,如拉刷新,你应该叫从需要更新的数据视图控制器NetworkManager的适当方法。