我是一名java开发人员,正在学习一个IPhone项目的Objective C,我的问题是关于Cocoa中的OOP设计。我有一个基于视图的应用程序,它与Web服务进行通信并重新获取xml,解析它并将其竞争映射到适当的视图组件(例如,如果日期显示带有datepicker的问题,如果问题有2值显示它与分段控件,如果更多与pickerview..etc)所以它是一个动态问题与许多页面。
考虑到cocoa框架,这里可能的最佳设计是什么,例如,如果我创建一个名为“Connection”的类来进行Web请求,我可以从我的ViewController类创建一个连接对象并使用它吗?或者我应该使用delegete类。因为我的类将包括如下方法:
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
[webData setLength: 0];
}
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
[webData appendData:data];
}
上面这种实现的方法是否必须放在viewcontroller类中?
第二个问题,我如何设计将xml响应映射到相关的UI视图组件?我希望尽可能使代码成为面向对象,如果在我的视图控制器类中没有太多,但是它应该只接收一个让我们说“uiview对象”填充必要的视图组件,它只会显示它。但映射和推理应该在其他地方完成。我可以在哪里做,然后我可以在哪里放置类似的方法;
-(NSInteger)pickerView:(UIPickerView *)pickerView
numberOfRowsInComponent:(NSInteger)component
{
return [itemArray count];
}
这必须在控制器类中吗?如果不是,我该如何访问这些方法。
希望我能清楚自己。
答案 0 :(得分:1)
对于第1部分,听起来您想要创建一个工厂/引擎类来处理与服务的通信和解析数据。在该类头声明中,您将需要创建一个协议(java术语中的接口),viewcontrollers将为委托方法实现该协议。这个类还有一个id类型的成员,它将包含一个回调委托对象。
要回答第2部分,您可以让您的工厂/引擎类在解析期间实际创建对象,并在所述委托调用中将它们返回到viewcontroller。
答案 1 :(得分:1)
您的解释很明确,是的。视图控制器在模型对象和视图之间建立接口。它负责在模型值更改时更新视图,并且还响应用户事件以更新模型。
委托方法可以在视图控制器中,只要它是NSURLConnection
对象的委托,但它可能是您想要设置为委托的任何对象,当然您必须确保此对象响应所需的委托方法。
在我看来,没有更好的设计,我通常将视图控制器对象设置为NSURLConnection
的委托。
关于第二个问题,我没有任何关于设计的建议。想象这样一个系统有点难,我不知道哪种解决方案更好用。 您可以使用包含字符串的索引数组。索引将表示可能的答案数,而字符串是要使用的对象的类名。
祝你好运。