2013-08-07 88 views
0

以下是我的設置:解決MVC混亂

  • Controller(.H/.M)
  • ConnectionManager(.H/.M) - 發送使用AFNetworking
  • RequestHandler請求(.H/.M) - 建立請求參數
  • KeyManager(.H/.M) - 寫入數據庫

我要發送到SER的請求ver從KeyManager獲取一些數據。

這裏的請求使用AFNetworking在ConnectionManager發送。所有的請求參數和網址請求由RequestHandler

構造,但問題是在爲了構建我已經從控制器請求一些數據的請求和我當初始化Controller內部RequestHandlers它引發錯誤控制器類型無法找到

Controller - >ConnectionManager - >RequestHandler - >Controller - >ConnectionManager - >服務器

請幫我拆這個爛攤子或解決方案。 另外如何將當前類的實例傳遞給另一個類的新實例。

+0

在頭文件中使用'@ class'而不是'#import' – Kevin

+0

爲什麼不讓你的控制器成爲singelton? – abbood

回答

2

解決這些類型的循環定義的最佳選擇是僅在.m文件中使用#import指令,而在.h文件中使用@class

所以基本上,如果你需要的Y類的API中類X的引用,然後在Y.h,你加@class X,然後在Y.m,添加#import X

@class簡單地定義符號。基本上告訴編譯器「相信我,我會告訴你這是什麼」。然後你在該類的實現中使用#import來堅持諾言。

這應該可以解決您的問題。

+0

這似乎是解決方案和更好的方法。謝謝,但你能告訴我單身人士是@abbood指出的一個壞方法嗎? – carbonr

1

一類需要另一個類的實例的一般問題可以用Dependency Injection模式

總之,如果你需要訪問對象的實例,給它依賴對象,當你創建它來解決。

對於您的RequestHandler,您可以構建一個像這樣的init方法。

-(instance_type)initWithController:(Controller *)acontroller 
{ 
self = [super init]; 
if(self) 
{ 
    _controller = acontroller; 
} 
return self; 

} 

或可替代的實例方法

-(void)setupHandlerWithController:(Controller *)acontroller 
{ 
//do what you need to do to setup 
} 

無論哪種方式意味着你給RequestHandler,它需要,而不是試圖設立的目的創建控制器實例的事RequestHandler

ConnectionManager多數民衆贊成在創建RequestHandler可能已經需要控制器交給它,所以它可以把它給了RequestHandler

TBH ID來尋找爲什麼的RequestHandler需要的因素進入控制器並試圖說出。

究竟是什麼做的RequestHandler需要從控制器並且可以將其直接給予那些東西。

這意味着您可以在多個地方使用RequestHandler,如果您只想給它提供所需的東西。

+0

我將不得不遵循mprivat解決方案來使用您的答案我認爲,因爲_controller不能被創建,否則。 – carbonr