2013-08-07 62 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