我正在构建一个基于 REST API 提供的数据的应用程序。我使用 Alamofire 框架从 API 请求数据。目前一切正常,但在很多方面都有点混乱,所以我想构建它并使用一些设计模式来更好地控制我的代码。
我创建了一些实体类,它们基本上是我的数据层。每次我使用这些对象时,数据层都应该是最新的。数据更新/API 连接可以通过时间间隔或用户操作触发(如果他编辑一些数据并保存它或类似的操作)。
此后,如果数据发生更改并且该视图控制器处于活动状态,我的 UI 应始终更新。
问题是请求和数据接收是异步的,我不知道构造一切的好方法。
目前对api的请求总是由viewcontroller触发。收到数据后,我通过委托调用视图控制器本身中的一些方法并更新 UI。发送到 API 的所有不同请求和不同数据有点混乱。我需要概括一切并清理它。目前的问题之一是,一个视图控制器只能处理一种请求。例如,视图控制器只能保存编辑过的帖子,但不能接收帖子,因为接收数据后会调用相同的方法。
那么,有谁知道它是如何正确且以非常结构化的方式完成的?也许是一些想法或设计模式,或者大玩家之一如何处理此类问题。
委托当然是您可以使用的一种设计模式,但我同意当您的 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 )
}
另请参阅 Swift 编程语言:闭包。
这更适用于 OS X,而不是 iOS,但特别是在 多个 ViewController 对响应感兴趣的情况下,你也可以开始发送 NSNotifications。但是,这样做会产生类似于委托方法的“难闻气味”,因为您将开始为每个 API 响应发明新的通知,所以我不推荐这种方法。