2

我有2个模型类,UserPlaceiPhone - 模型类内部网络代码 - 代码设计问题

我需要获取用户的附近地点,我从服务器获得的数据。 用户拥有currentLocation的属性。

由于Place类感觉像getNearByPlacesForLocation这样的方法更合适,所以我认为它是我的Place类中的静态方法。

我想了解一下两件事情:

  1. 这听起来是一个正确的架构?
  2. 在我的模型中放置网络代码(在本例中,在getNearByPlacesForLocation之内)是否正确?或者我应该使用像'NetworkManager'这样的一些singelton?但是在这种情况下,我的模型不能重用,因为它取决于这个'NetworkManager'类。 你会如何解决它?

经过一番思考练到这样的设计: User.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

​​

这样我就可以做一些依赖注入,并不依赖于我的Place类中的任何特定的网络实现。

我还是很好奇,但是如果在每个模型类中使用这些方法比'NetworkManager'更好,singelton的单一职责是向我提供我从服务器请求的数据,我可以在其中引用' NetworkManager'在我的UIViewControllers里面。 我觉得自己喜欢与模型对象进行交互,并且在我的UIViewController中询问来自它们的数据更加干净和有条理,但我很乐意听到其他人的意见。

回答

0

是的,你说的是完美的。你的用户界面代码和控制器代码应该是分开的,这就是cz,如果你想把它放在其他应用程序中,或者如果你想制作另一个iPad/iphone版本的应用程序,你的代码将被重新分配。您只需更改UI设置,并且如果您开发了网络管理员类,则可以将其轻松放置到任何其他应用程序中,更多的代码将变得独立并且非常易于维护。