如何在Objective-C中引用调用类

And*_*rew 3 oop cocoa objective-c

您是否可以在不将发件人作为参数传递的情况下引用邮件的发件人?这是为了讨论而简化的代码:

// mainTableViewController.m
    [dataModel loadData];    //Table is requesting data based on user input

// dataModel.m
  -(void) loadData{

    // I want to store the sender for later reference
    sendingTableViewController = ???? ;  
  }

  - (void) connectionDidFinishLoading:(NSURLConnection *)connection {
        // Web data is loaded. Ask the sending tableViewController to 
        //  reload it's data.
    [sendingTableViewController.tableView reloadData];
  } 
Run Code Online (Sandbox Code Playgroud)

我仍然习惯于如何引用另一个对象负责的方法和属性.我想发送一条消息dataModel来加载一些数据NSURLConnection.但我不只是想返回数据,因为我不想坐等待数据加载.我想发一条消息给mainTableViewController曾经connectionDidFinishLoading叫过的人.

由于该loadData方法可以从任何数量的tableViewControllers我调用,不能只说[mainTableViewController reloadData].

后续问题
很棒的信息!我喜欢StackOverflow的无判断性质.

那么这mainTableViewController将是代表dataModel
说这个dataModel定义了非正式协议是否正确?
我目前dataModel在我的内部实例化我的课程mainTableViewController.所以我可以改变我的代码:

// mainTableViewController.m
    dataModel *myDataModel = [[dataModel alloc] initWithDelegate:self ];

    // Does this method need to be defined in the mainTableViewController header file
    //  since I will already have defined it in the dataModel header file?
  -(void) dataDidFinishLoading {
    [self.tableView reloadData];
  }

// dataModel.m
  -(id) initWithDelegate:(id)aDelegate{
    self.delegate = aDelegate;
  }

  -(void) connectionDidFinishLoading:(NSURLConnection *)connection {
    [self.delegate dataDidFinishLoading];
  }  
Run Code Online (Sandbox Code Playgroud)

这样做不好,我TableViewController被实例化数据模型我,因为那样我的dataModel拥有由TableViewController?我应该真的dataModel从AppDelegate 实例化吗?

谢谢!

Mar*_*c W 8

我敢说这不是思考这个问题的正确方法.在结构上,通过给表视图控制器的数据模型的知识,你是连接你的模型层到控制器层.违反关注点分离是件坏事.

在Cocoa中,遍布整个地方使用委托对象.委托对象是一个实现具有回调方法的特定协议的对象,当事件或事件(例如从您的情况下从远程位置加载数据)发生时,可以调用这些方法.我建议您在数据模型中创建一个委托属性,具有一个mainTableViewController(或任何其他类,实际上)实现的接口,并将该类指定为委托.然后,当数据加载完毕后,调用相应的方法self.delegate.在该回调方法中,您可以调用[tableView reloadData].

同样,您不希望您的数据模型与控制器类的存在耦合(意味着).

编辑

我只是重新阅读你的问题的最后一部分,关于让多个表控制器需要监听正在加载的数据的通知.为此,我建议您使用Cocoa中的Observer模式NSNotificationCenter.您可以使用数据模型中的通知中心向观察者发送通知(您不关心谁在观察;通知中心处理这些详细信息),您还可以在表控制器中使用它来订阅通知.代理是一个很好的,简单的解决方案,如果您只需要在发生某事时直接调用一个对象.通知更复杂,开销更大,但您可以灵活地让任意数量的对象"监听"通知发布.

后续回应

一个类没有定义非正式协议; 开发人员.您还可以在单​​独的.h文件中定义正式协议,并让控制器实现它,如果您需要可执行的合同.使用正式协议,您还可以使用@optional不必由符合协议的类实现的方法.

从表视图控制器中实例化数据模型也一点都不错.事实上,这是一种非常正确的方法.由于数据模型的存在是为了封装控制器希望稍后显示的数据(可能),您可以将控制器视为拥有数据模型.您甚至可以考虑创建一个实例变量(也可能是一个属性)来存储您的数据模型.除此之外,你重写的代码对我来说很好看!