Tag: Promise

ReactiveSwift的Promise语法

使用闭包接收异步操作的结果 接收异步操作的结果已经很久了。 在iOS上,它以Delegate,Notification开始。 自从引入Objective-C的代码块以来,它已经演变为使用Swift的Closure。 特别地,闭包是功能编码的核心。 由于它的紧凑表示形式和基于编译器强大推断能力的各种简短公式,它也几乎用于Swift编码的各个方面。 使用Closure处理工作的结果有多种方法。 您可以考虑处理用户操作的结果,例如处理UI事件或处理警报选择结果。 此外,它可以在通过GCD执行异步操作后接收结果,也可以用于通过网络接收数据时的处理。 让我们考虑一下使用Closure调用Restful API之后接收结果的过程。 基本上,您需要一个闭包以在调用成功时接收结果,并需要一个闭包以在失败时接收错误。 您必须将两个闭包对象作为参数传递给调用Restful API的方法。 func getUserProfile(userId:Int,complete:(((JSON)-> Void),failure:((Error)-> Void)){ //成功调用成功,失败调用失败 } 这是最简单的思考方式。 然而,这种类型的封闭物递送和结果接收存在缺点。 上面调用getUserProfile函数的语法如下所示。 getUserProfile(userId:123,complete:{json in //成功动作 },失败:{error in //失败动作 }) 如果要将另一个状态的处理程序添加到getUserProfile,则不方便更改所有其他调用此方法的部分。 另外,如果将多个闭包作为方法参数传递,则不容易理解方法本身的签名,并且阅读起来也不那么好。 应用Promise语法 考虑一下JavaScript的承诺。 处理JS异步操作结果的传统方法是将Callback函数作为参数传递给工作函数。 但是,JS应用程序变得更加复杂,回调函数也变得更大。 同样,如果必须连续执行异步处理,则必须嵌套多个回调函数。 因此,它导致了代码难以阅读的问题。 解决这个问题的承诺已经出现。 可以将Promise对象传递给Task并为其添加一个Handler,而不是将Callback函数作为参数传递给work函数。 结果,诸如处理结果或执行另一任务的代码可以被添加为链。 这种方法解决了回调函数的缺点。 somePromise(task).then((result)=> { //做其他任务 })。then((result)=> { //结果处理 }) 通过上述链结构,一个函数只能包含与一项任务相关的代码,并且可以解决回调函数的嵌套问题。 在iOS开发中,闭包对象很少嵌套。 但是,在iOS中,如前面的示例中所述,类似的是,当将闭包作为函数的参数传递时,函数调用语法很复杂,并且很难修改签名。 因此,让我们创建一个类似于JavaScript的Promise对象,以改进用于异步处理的代码,并使用它来调用Restful API。 换句话说,我想向您展示如何通过以下语法使用getUserProfile。 […]