0

我正在开发一个适用于 iphone 的应用程序,我从 php 服务器加载 JSON,用库解析它并用这些数据创建一个对象。我的代码工作正常,但我这样做的方式对我来说似乎是错误的:

viewController 向用户显示加载视图。同时 ViewController 发出 get 请求并接收数据。VC 解析响应并获取字典 字典被发送到“创建者类”,该创建者类返回从字典创建的对象

我做了两次这个操作,但我认为这是一个糟糕的设计:

视图控制器应该执行 http 请求吗?不应该是“objectLoader”吗?创建类的主要方法做了一大堆 if/else 意大利面条,比如:

for(NSString key in dictionary){
    if(key isEqualToString "a key"){
         perform action
    }
    else if(key isEqualToString "an other key"){
         perform action
    }
    ....
}

有什么办法解决这个问题吗?我正在考虑制作一个键/选择器字典来解决它并执行以下操作:

 for(NSString key in dictionary){
    [self performSelector:[selectors getObjectForKey:key]]
}

但我不知道我是否可以在字典中引用选择器......

最后,我想到的另一个选择是使用类方法将解析后的字典发送到对象:[ClassName createObjectWithDictionary:parsedDictionary]. 这是一个好方法吗?

我知道这个问题有点模棱两可,但我对应该应用哪些设计模式以及谁负责这个故事中的内容有点迷茫

4

2 回答 2

2

最好的方法是使用 MVC 模式并让模型具有数据,该模型具有在其中推送和删除一些数据的方法以及在模型数据更改时通知的委托列表(派生自 UIViewController)。控制器(不是 UIViewController)是启动从服务器获取数据并处理结果的东西。所有的 UIViewController 都处理数据更改和用户交互。现在,编写一些处理请求例程并存储所有必要数据以在控制器中触发事件的 RequestController(是否单调,无关紧要)。您可以使用块或 NSNotificationCenter 来处理请求的完成。通过 RequestController 从请求中获取必要的数据后,您的 Controller 可以创建必要的解析器并将解析后的数据推送到模型中。

于 2012-08-22T19:25:06.007 回答
1

就个人而言,我不会让 ViewController 执行 HTTP 请求。我总是在我的应用程序中编写服务类,这些服务类执行低级别的工作并通过委托通知调用者(例如视图控制器)任何收到的结果。

所以这种情况下的控制流程是: -> ViewController 锁定屏幕并加载消息 -> 以自己作为委托调用服务 - 服务完成工作并接收答案 -> 处理答案并将结果传递给委托 -> ViewController 接受响应,删除加载消息并对响应执行任何必要的操作。

关于你的第二个问题:是的,可以从字典中动态选择一个选择器 - 例如通过将选择器的名称存储在字典中然后使用

SEL selector = selectorFromString(@"doWork");

创建正确的选择器来调用。

于 2012-08-22T19:21:49.830 回答