Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 设计模式HTTP Api_Ios_Swift_Api_Http_Design Patterns - Fatal编程技术网

Ios 设计模式HTTP Api

Ios 设计模式HTTP Api,ios,swift,api,http,design-patterns,Ios,Swift,Api,Http,Design Patterns,我正在构建一个基于RESTAPI提供的数据的应用程序。我使用alamofire框架从api请求数据。目前一切正常,但在很多方面都有点混乱,所以我想对它进行组织,并使用一些设计模式来更好地控制我的代码 我创建了一些基本上是我的数据层的实体类。每次使用这些对象时,数据层都应该是最新的。数据更新/api连接可能由时间间隔或用户操作触发(如果他编辑一些数据并保存它或类似的内容) 在此之后,如果数据已更改并且viewcontroller处于活动状态,则我的UI应始终更新 问题是数据的请求和接收是异步的,我

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

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

在此之后,如果数据已更改并且viewcontroller处于活动状态,则我的UI应始终更新

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

此时,对api的请求始终由viewcontroller触发。收到数据后,我通过委派调用viewcontroller本身中的一些方法并更新ui。发送到api的所有不同请求和不同数据都有点混乱。我需要概括一切,把它清理干净。目前的问题之一是,一个viewcontroller只能处理一种请求。例如,viewcontroller只能保存已编辑的帖子,但不能接收帖子,因为接收数据后会调用相同的方法


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

委派当然是一种可以使用的设计模式,但我同意,当您的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 )

}
另见

通知
这更适用于OSX而不是iOS,尤其是在多个ViewController对响应感兴趣的情况下,您也可以开始发送通知。但是,这样做会有类似于委托方法的“坏味道”,因为您将开始为每个API响应创建新的通知,所以我不推荐这种方法。

是的,这是一种函数式编程方法。我在一些项目中做过,但还是有点混乱。也许我再试一次,重构我的代码。谢谢你的回答!