Ios 解决MVC混沌
以下是我的设置:Ios 解决MVC混沌,ios,objective-c,Ios,Objective C,以下是我的设置: 控制器(.h/.m) ConnectionManager(.h/.m)-使用AFN网络发送请求 RequestHandler(.h/.m)-生成请求参数 KeyManager(.h/.m)-写入数据库 我必须向服务器发送一个请求,其中包含来自KeyManager的一些数据 在这里,使用ConnectionManager中的AFNetworking发送请求。请求的所有请求参数和URL都由RequestHandler 但问题是为了构造请求,我从控制器请求了一些数据,当初始化co
(.h/.m)控制器
(.h/.m)-使用AFN网络发送请求ConnectionManager
(.h/.m)-生成请求参数RequestHandler
(.h/.m)-写入数据库KeyManager
ConnectionManager
中的AFNetworking发送请求。请求的所有请求参数和URL都由RequestHandler
但问题是为了构造请求,我从控制器请求了一些数据,当初始化controller
内部RequestHandlers
时,它抛出错误,无法找到控制器类型
控制器
->连接管理器
->请求处理程序
->控制器
->连接管理器
->服务器
我如何解决这个问题?另外,如何将类的当前实例传递给另一个类的新实例?解决此类循环定义的最佳选择是仅在
.m
文件中使用\import
指令,而在.h
文件中使用@class
因此,基本上如果您需要在API中为类Y引用类X,那么在Y.h中,您添加@class X
,然后在Y.m
中,您添加\import X
@class
仅定义符号。基本上告诉编译器“相信我,我稍后会告诉你这是什么”。然后,通过在该类的实现中使用#import
来遵守承诺
这应该可以解决您的问题。解决此类循环定义的最佳选择是仅在
.m
文件中使用#import
指令,而在.h
文件中使用@class
因此,基本上如果您需要在API中为类Y引用类X,那么在Y.h中,您添加@class X
,然后在Y.m
中,您添加\import X
@class
仅定义符号。基本上告诉编译器“相信我,我稍后会告诉你这是什么”。然后,通过在该类的实现中使用#import
来遵守承诺
这应该可以解决您的问题。一个类需要另一个类的实例的一般问题可以使用该模式解决 简而言之,如果需要访问对象的实例,请在创建依赖对象时将其提供给该对象 对于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而尝试创建控制器实例
创建请求处理程序的连接管理器可能已经需要将控制器交给它,以便将其交给请求处理程序
TBH我正在研究为什么RequestHandler需要访问控制器,并尝试将其考虑在内
确切地说,RequestHandler需要从控制器中获得什么,并且可以直接向它提供这些东西
这意味着您可以在多个地方使用RequestHandler,如果您愿意的话,只需给它所需的东西。一个类需要另一个类的实例的一般问题可以使用该模式解决 简而言之,如果需要访问对象的实例,请在创建依赖对象时将其提供给该对象 对于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而尝试创建控制器实例
创建请求处理程序的连接管理器可能已经需要将控制器交给它,以便将其交给请求处理程序
TBH我正在研究为什么RequestHandler需要访问控制器,并尝试将其考虑在内
确切地说,RequestHandler需要从控制器中获得什么,并且可以直接向它提供这些东西
这意味着您可以在多个位置使用请求处理程序,只需提供它所需的东西即可。在头文件中使用
@class
,而不是\import
为什么不将控制器设为单个?在头文件中使用@class
而不是\import
为什么不你只是把你的控制器变成了一个单体?这似乎是一个更好的解决方案。谢谢,但是你能告诉我单例是不是像@abbood所指出的那样是一个糟糕的方法吗?这似乎是一个解决方案,也是一个更好的方法。谢谢,但是你能告诉我单例是@abbood指出的一种糟糕的方法吗?我必须遵循mprivat解决方案来使用你的答案,我认为,因为\u控制器不能以其他方式创建。我必须遵循mprivat解决方案来使用你的答案,我认为,因为\u控制器不能以其他方式创建。