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

Posted

技术标签:

【中文标题】iPhone - 模型类中的网络代码 - 代码设计问题【英文标题】:iPhone - Network code inside model classes - Code Design Issue 【发布时间】:2012-05-15 12:07:09 【问题描述】:

我有 2 个模型类,UserPlace

我需要获取用户的附近地点,即我从服务器获取的数据。 用户拥有 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() 方法?

如何从 iPhone 中的货币代码中获取货币符号?

浏览器沙箱模型

如何处理 iPhone 中的网络切换?

Cocoa / iOS / iPhone中的模型对象所有权和MVC

配色设计的色彩网络模型