我正在构建一个基于REST API提供的数据的应用程序。我使用alamofire框架从api请求数据。目前一切正常但有点混乱,所以我想构建它并使用一些设计模式来控制我的代码。
我创建了一些基本上属于我的数据层的实体类。每次使用这些对象时,数据层都应该是最新的。数据更新/ api连接可以通过时间间隔或用户操作触发(如果他编辑某些数据并保存它或者像这样)。
之后,如果数据已更改且视图控件是否处于活动状态,我的UI应始终更新。
问题是请求和数据接收是异步的,我不知道构建所有内容的好方法。
此时,对api的请求始终由viewcontroller触发。收到数据后,我通过委托调用viewcontroller本身的一些方法并更新ui。对于发送到api的所有不同请求和不同数据,这是一种混乱。我需要概括一切并清理它。目前的一个问题是,一个视图控制器只能处理一种请求。例如,viewcontroller只能保存已编辑的帖子,但无法接收帖子,因为在接收数据后会调用相同的方法。
那么,有没有人知道它是如何以一种非常有条理的方式正确完成的?也许是一些想法或设计模式,或者其中一个大玩家如何处理这些问题。
答案 0 :(得分:0)
委托当然是一种你可以使用的设计模式,但我同意当你的API增长并且你开始为每一个API调用引入新的委托方法时它会变得混乱。
我想实现异步回调的首选方法是使用闭包。在ViewController中,您只需将闭包传递给请求方法:
requestHandler.sendSomeRequest(param1, parameter2: param2, completion: { (response) -> Void in
// This is executed asynchronously, but you can still access all properties of your ViewController
// Just make sure you're on the main thread when you need to update your UI
}
RequestHandler方法的定义如下:
func sendSomeRequest( parameter1: String, parameter2: String, completion: ( response: String)->Void ) {
// Send the request, and pass/store the "completion" closure until you get the response back.
// Then, just call:
completion( response )
}
另见The Swift Programming Language: Closures。
这更适用于OS X而不是iOS,但特别是在多个 ViewController对响应感兴趣的情况下,您也可以开始发送NSNotifications。然而,这样做会产生类似的难闻气味。就像委托方法一样,因为你会开始为每个API响应发明新的通知,所以我不推荐这种方法。