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 实例化吗?
谢谢!
我敢说这不是思考这个问题的正确方法.在结构上,通过给表视图控制器的数据模型的知识,你是连接你的模型层到控制器层.违反关注点分离是件坏事.
在Cocoa中,遍布整个地方使用委托对象.委托对象是一个实现具有回调方法的特定协议的对象,当事件或事件(例如从您的情况下从远程位置加载数据)发生时,可以调用这些方法.我建议您在数据模型中创建一个委托属性,具有一个mainTableViewController
(或任何其他类,实际上)实现的接口,并将该类指定为委托.然后,当数据加载完毕后,调用相应的方法self.delegate
.在该回调方法中,您可以调用[tableView reloadData]
.
同样,您不希望您的数据模型与控制器类的存在耦合(意味着).
编辑
我只是重新阅读你的问题的最后一部分,关于让多个表控制器需要监听正在加载的数据的通知.为此,我建议您使用Cocoa中的Observer模式NSNotificationCenter
.您可以使用数据模型中的通知中心向观察者发送通知(您不关心谁在观察;通知中心处理这些详细信息),您还可以在表控制器中使用它来订阅通知.代理是一个很好的,简单的解决方案,如果您只需要在发生某事时直接调用一个对象.通知更复杂,开销更大,但您可以灵活地让任意数量的对象"监听"通知发布.
后续回应
一个类没有定义非正式协议; 开发人员.您还可以在单独的.h
文件中定义正式协议,并让控制器实现它,如果您需要可执行的合同.使用正式协议,您还可以使用@optional
不必由符合协议的类实现的方法.
从表视图控制器中实例化数据模型也一点都不错.事实上,这是一种非常正确的方法.由于数据模型的存在是为了封装控制器希望稍后显示的数据(可能),您可以将控制器视为拥有数据模型.您甚至可以考虑创建一个实例变量(也可能是一个属性)来存储您的数据模型.除此之外,你重写的代码对我来说很好看!
归档时间: |
|
查看次数: |
304 次 |
最近记录: |