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)
  • ConnectionManager
    (.h/.m)-使用AFN网络发送请求
  • RequestHandler
    (.h/.m)-生成请求参数
  • KeyManager
    (.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控制器不能以其他方式创建。