【问题标题】:Design Pattern HTTP Api设计模式 HTTP API
【发布时间】:2016-04-16 04:10:19
【问题描述】:

我正在构建一个基于 REST api 提供的数据的应用。我使用 alamofire 框架从 api 请求数据。目前一切正常,但在很多方面有点混乱,所以我想构建它并使用一些设计模式来更好地控制我的代码。

我创建了一些实体类,它们基本上是我的数据层。每次我使用这些对象时,数据层都应该是最新的。数据更新/api连接可以由时间间隔或用户操作触发(如果他编辑一些数据并保存它或类似这样)。

之后,如果数据已更改并且该视图控制器处于活动状态,我的 UI 应始终更新。

问题是请求和接收数据是异步的,我不知道有什么好的方法来构造所有内容。

目前对 api 的请求总是由 viewcontroller 触发。收到数据后,我通过委托调用视图控制器本身中的一些方法并更新 ui。发送到 api 的所有不同请求和不同数据有点混乱。我需要概括一切并清理它。目前的问题之一是,一个视图控制器只能处理一种请求。比如viewcontroller只能保存编辑过的帖子,不能接收帖子,因为收到数据后会调用同样的方法。

那么,有谁知道它是如何以一种非常结构化的方式正确完成的?也许是一些想法或设计模式,或者某个大玩家如何处理这些问题。

【问题讨论】:

    标签: ios swift api http design-patterns


    【解决方案1】:

    委托当然是您可以使用的一种设计模式,但我同意当您的 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 响应发明新的通知,因此我不推荐这种方法。

    【讨论】:

    • 是的,这是一种函数式编程方式。我在几个项目中这样做了,但它仍然有点混乱。也许我再试一次并重构我的代码。感谢您的回答!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-12
    • 1970-01-01
    • 2015-10-27
    相关资源
    最近更新 更多