iPhone - 模型类中的网络代码 - 代码设计问题
Posted
技术标签:
【中文标题】iPhone - 模型类中的网络代码 - 代码设计问题【英文标题】:iPhone - Network code inside model classes - Code Design Issue 【发布时间】:2012-05-15 12:07:09 【问题描述】:我有 2 个模型类,User
和 Place
。
我需要获取用户的附近地点,即我从服务器获取的数据。 用户拥有 currentLocation 的属性。
由于 Place 类感觉更适合拥有像 getNearByPlacesForLocation
这样的方法,我想将它作为我的 Place 类中的静态方法。
我想知道两件事:
-
这听起来像是正确的架构吗?
将网络代码放入我的模型中(在本例中,在
getNearByPlacesForLocation
中)是正确的方法吗?或者我应该使用一些像 'NetworkManager' 这样的单例?但同样在这种情况下,我的模型将无法重用,因为它依赖于这个“NetworkManager”类。
你会怎么解决?
经过一番思考,我得到了这个设计: 用户.m
@implementation User
@synthesize currentLocation;
- (NSArray*) getNearbyPlaceForCurrentLocation
[Place getNearByPlacesForLocation:currentLocation];
@end
Place.m
#import "Place.h"
#import "NetworkServicesDataSource.h"
@implementation Place
static id<NetworkServicesDataSource> _networkDataSource;
+(void) setNetworkManager:(id<NetworkServicesDataSource>)networkDataSource
_networkDataSource = networkDataSource;
+(NSArray*) getNearByPlacesForLocation:(CLLocationCoordinate2D) loc
return [_networkDataSource getNearByPlacesForLocation:loc];
@end
NetworkServicesDataSource.h
#import <Foundation/Foundation.h>
@protocol NetworkServicesDataSource <NSObject>
-(NSArray*) getNearByPlacesForLocation:(CLLocationCoordinate2D) loc;
@end
这样我可以进行某种依赖注入,而不依赖于我的 Place 类中的任何特定网络实现。
我仍然很好奇,尽管在每个模型类中使用这些方法是否比拥有一个“NetworkManager
”singelton 更好,后者的唯一职责是从服务器获取我请求的数据,我可以在其中引用这个'NetworkManager
' 在我的UIViewControllers
中。
我觉得在我的UIViewController
中与模型对象进行交互并从它们那里获取数据更加简洁和结构化,但我很乐意听取其他人的意见。
【问题讨论】:
【参考方案1】:是的,你说的很完美。你的 UI 代码和控制器代码应该是分开的,如果你想把它放在其他应用程序中,或者如果你想制作另一个 iPad/iphone 版本的应用程序,你的相同代码将被重新使用。您只需要更改 UI 设置,如果您开发了一个网络管理器类,您可以轻松地将其放置到任何其他应用程序中,而且您的代码变得独立且非常易于维护。
【讨论】:
以上是关于iPhone - 模型类中的网络代码 - 代码设计问题的主要内容,如果未能解决你的问题,请参考以下文章
如何将 View 类中的代码片段移动到 OnAppearing() 方法?