0

以下是我的设置:

  • Controller(.h/.m)
  • ConnectionManager(.h/.m) - 使用 AFNetworking 发送请求
  • RequestHandler(.h/.m) - 构建请求参数
  • KeyManager(.h/.m) - 写入数据库

我必须使用来自 KeyManager 的一些数据向服务器发送请求。

这里请求是使用 AFNetworking in 发送的ConnectionManager。请求的所有请求参数和 URL 由RequestHandler

但问题是为了构造请求,我从控制器请求了一些数据,我在初始化Controller内部RequestHandlers时抛出错误 Controller type can't be found

Controller-> ConnectionManager-> RequestHandler-> Controller-> ConnectionManager->服务器

我该如何解决这个问题?另外,如何将类的当前实例传递给另一个类的新实例?

4

2 回答 2

2

解决此类循环定义的最佳选择是仅#import在文件中使用指令,.m而不是@class.h文件中使用。

所以基本上,如果您需要在 API 中为类 Y 引用类 X,那么在 Yh 中添加@class X,然后在 中Y.m添加#import X

@class简单地定义符号。基本上告诉编译器“相信我,我稍后会告诉你这是什么”。#import然后,您通过在该类的实现中使用来信守承诺。

这应该可以解决您的问题。

于 2013-08-07T14:22:42.070 回答
1

一个类需要另一个类的实例的一般问题可以使用依赖注入模式来解决

简而言之,如果您需要访问对象的实例,请在创建它时将其提供给依赖对象。

对于您的 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 提供它需要的东西,而不是尝试创建一个Controller实例来设置RequestHandler

创建RequestHandlerConnectionManager可能已经需要将 Controller交给它,以便它可以将它交给RequestHandler

TBH 我正在研究为什么RequestHandler 需要访问控制器并尝试将其排除。

RequestHandler究竟需要Controller提供什么,是否可以直接提供这些东西。

这意味着您可以在多个地方使用RequestHandler,如果您想简单地给它提供它需要的东西。

于 2013-08-07T15:33:07.070 回答