博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
基于ObjC的轻量级Promise库——RWPromiseKit
阅读量:6094 次
发布时间:2019-06-20

本文共 2104 字,大约阅读时间需要 7 分钟。

闲来无事。在看JavaScript的时候发现Promise这东西不错。将隐藏在异步调用中的逻辑变成了同步调用。

getJSON("/posts.json").then(function(posts) {  // ...  consume(posts);}).catch(function(error) {  console.log('something wrong!', error);});

关于Promise,可以看和

github上搜了一下有一个Star比较多的。大致浏览了一下,主要是靠RunLoop的实现的(也有用OperationQueue实现的)。

实现

构思了一下,通过ARC+KVO完全可以实现promise之间依赖关系。至于链式调用,在我的另一篇中有介绍了,不在此赘述了。

代码放在我的上了。欢迎拍砖。

功能

Promise

构造一个promise:

RWPromise* p1 = [RWPromise promise:^(ResolveHandler resolve, RejectHandler reject) {                    if (condition){                        resolve(@"result");                    }else{                        reject(@"result");                    }                }];

resolvereject用于改变promise的状态,由promise生成者来决定。调用resolvereject可以同步或者异步。

then 和 catch

  • then

    then本身会返回一个新的promise。新的promise会依赖于上一个promise的状态。

当promise的状态在变成Resolved之后会调用then传入的block。前一个promise中resolve的value会传递给then产生的promise。

then的block中必须返回一个值,若返回值不是RWPromise,则等价于调用reslove(value)

这里我对then做了一些改造,只传了resolved的handler。并没有传入rejected的handler。

  • catch

    catch本身也会返回一个新的promise。新的promise会依赖于promise链上所有promise的状态。若某个promise的状态为rejected,则会调用整个链上上的第一个catch的promise。

看如下代码:

[RWPromise promise:^(ResolveHandler resolve, RejectHandler reject) {                    resolve(@"1");                }].then(^id(id value){                    NSLog(value);                    return @"2";                }).catch(^(NSError* e){                    NSLog(@"error");                }).then(^id(id value){                    NSLog(value);                    return nil;                });

最后结果为:

1

2

[RWPromise promise:^(ResolveHandler resolve, RejectHandler reject) {                    reject(nil);                }].then(^id(id value){                    NSLog(value);                    return @"2";                }).catch(^(NSError* e){                    NSLog(@"error");                }).then(^id(id value){                    NSLog(value);                    return nil;                });

结果为:

error

<nil>

上面参考的链接有详细的解释,不多说了,具体参见javascript。目前支持的API:

then
catch
finally
after
retry
timeout
map
filter
reduce
race
all
resolve
reject

  • 存在的问题

  1. Block支持多参数

原作写于segmentfault

转载地址:http://kswza.baihongyu.com/

你可能感兴趣的文章
解读自定义UICollectionViewLayout--感动了我自己
查看>>
SqlServer作业指定目标服务器
查看>>
UnrealEngine4.5 BluePrint初始化中遇到编译警告的解决办法
查看>>
User implements HttpSessionBindingListener
查看>>
抽象工厂方法
查看>>
ubuntu apt-get 安装 lnmp
查看>>
焊盘 往同一个方向增加 固定的长度方法 总结
查看>>
eclipse的maven、Scala环境搭建
查看>>
架构师之路(一)- 什么是软件架构
查看>>
jquery的冒泡和默认行为
查看>>
Check failed: error == cudaSuccess (7 vs. 0) too many resources requested for launch
查看>>
USACO 土地购买
查看>>
【原创】远景能源面试--一面
查看>>
B1010.一元多项式求导(25)
查看>>
10、程序员和编译器之间的关系
查看>>
前端学习之正则表达式
查看>>
配置 RAILS FOR JRUBY1.7.4
查看>>
AndroidStudio中导入SlidingMenu报错解决方案
查看>>
http://www.blogjava.net/pdw2009/archive/2007/10/08/151180.html
查看>>
hadoop(6)---mapred-site.xml 详解以及常用配置。
查看>>