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設置,並且如果您開發了網絡管理員類,則可以將其輕鬆放置到任何其他應用程序中,更多的代碼將變得獨立並且非常易於維護。