iPhone-模型类内部的网络代码-代码设计问题

iPhone-模型类内部的网络代码-代码设计问题,iphone,model-view-controller,design-patterns,architecture,uiviewcontroller,Iphone,Model View Controller,Design Patterns,Architecture,Uiviewcontroller,我有两个模型类,User和Place 我需要获取用户附近的位置,即从服务器获取的数据。 用户具有currentLocation属性 由于Place类更适合使用类似于getNearByPlacesForLocation的方法,因此我考虑将其作为Place类中的静态方法 我想知道两件事: 这听起来像是正确的架构吗 将网络代码放在我的模型中(在本例中,放在getNearByPlacesForLocation)是正确的方法吗?或者我应该用像“网络经理”这样的单子?但在这种情况下,我的模型将无法重用,因为

我有两个模型类,
User
Place

我需要获取用户附近的位置,即从服务器获取的数据。 用户具有currentLocation属性

由于Place类更适合使用类似于
getNearByPlacesForLocation
的方法,因此我考虑将其作为Place类中的静态方法

我想知道两件事:

  • 这听起来像是正确的架构吗
  • 将网络代码放在我的模型中(在本例中,放在
    getNearByPlacesForLocation
    )是正确的方法吗?或者我应该用像“网络经理”这样的单子?但在这种情况下,我的模型将无法重用,因为它依赖于这个“NetworkManager”类。 你将如何解决它 经过一番思考,我得出了这个设计: User.m

    @implementation User
    
    @synthesize currentLocation;
    
    - (NSArray*) getNearbyPlaceForCurrentLocation
    {
        [Place getNearByPlacesForLocation:currentLocation];
    }
    
    @end
    
    #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
    
    Place.m

    @implementation User
    
    @synthesize currentLocation;
    
    - (NSArray*) getNearbyPlaceForCurrentLocation
    {
        [Place getNearByPlacesForLocation:currentLocation];
    }
    
    @end
    
    #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
    
    #导入“Place.h”
    #导入“NetworkServicesDataSource.h”
    @实施地点
    静态id_网络数据源;
    +(void)setNetworkManager:(id)networkDataSource
    {
    _networkDataSource=networkDataSource;
    }
    +(NSArray*)靠近地点位置:(CLLOCATION Coordinated2D)loc
    {
    return[_networkdatasourcegetnearbyplacesforlocation:loc];
    }
    @结束
    
    网络服务数据源.h

    #import <Foundation/Foundation.h>
    
    @protocol NetworkServicesDataSource <NSObject>
    
    -(NSArray*) getNearByPlacesForLocation:(CLLocationCoordinate2D) loc;
    
    @end
    
    #导入
    @协议网络服务数据源
    -(NSArray*)靠近地点:(CLLOCATION Coordinated2D)loc;
    @结束
    
    这样我就可以进行某种依赖注入,而不依赖于Place类中的任何特定网络实现

    我仍然很好奇,如果在每个模型类中都有这些方法是否比在
    UIViewControllers
    中有一个“
    NetworkManager
    ”Singleton更好,他唯一的责任是从服务器获取我请求的数据,我可以在
    UIViewControllers
    中引用这个“
    NetworkManager
    ”。
    我想在我的
    UIViewController
    中与模型对象进行交互并询问它们的数据,但是我很乐意听取其他人的意见。

    是的,你说的很好。你的UI代码和控制器代码应该是分开的,这是cz如果你想把它放在其他应用程序中,或者如果你想制作另一个iPad/iphone版本的应用程序,同样的代码将被恢复。你只需要更改UI设置,如果你开发了一个网络管理器类,你可以很容易地将它放到任何其他应用程序中,你的代码变得更加独立和易于维护

    是的,你说的很好。你的UI代码和控制器代码应该是分开的,这是cz如果你想把它放在其他应用程序中,或者如果你想制作另一个iPad/iphone版本的应用程序,同样的代码将被恢复。你只需要更改UI设置,如果你开发了一个网络管理器类,你可以很容易地将它放到任何其他应用程序中,你的代码变得更加独立和易于维护