Q-ios
为iOS提供异步承诺实现。
受Node的Q异步承诺库的启发,这个库提供了Promises/A+规范的局部实现。
安装
使用CocoaPods安装
pod 'Q'
用法
创建一个新的承诺
#import "Q.h"
...
QPromise *promise = [QPromise new];
稍后,用一个结果值解决承诺
id value = @"something";
[promise resolve:value];
或者用一个错误拒绝承诺
NSError *error = [self raiseError];
[promise reject:error];
可以使用块提供承诺后续
QPromise *promise = [self asynchronousOp];
promise.then((id)^(id result) {
// Use result.
})
.fail(^(id error) {
// Handle error.
});
使用块
QPromise *promise = [QPromise new];
promise.then((id)(^id result) {
return [QPromise resolve:@"a result!"];
});
或通过用承诺解决承诺来链式承诺
QPromise *promiseA = [QPromise new];
QPromise *promiseB = [QPromise new];
/// ...stuff...
promiseA.resolve( promiseB );
创建一个已解决的承诺
QPromise *resolved = [QPromise resolve:@"a result!"];
或创建一个已拒绝的承诺
QPromise *rejected = [QPromise reject:@"obsolete"];
多个承诺
可以使用all:方法在一次操作中解决多个异步操作。
QPromise *promise1 = [self httpGet:url1];
QPromise *promise2 = [self httpGet:url2];
QPromise *promise3 = [self httpGet:url3];
NSArray *pending = @[ promise1, promise2, promise3 ];
[QPromise all:pending]
.then((id)^(NSArray *results) {
id result1 = results[1];
id result2 = results[2];
id result3 = results[3];
// Process results...
})
.fail(^(id error) {
// Process error...
});
如果任何异步操作失败且其promise被拒绝,那么第一个错误将被传递到fail块。此时,then块将接收到一个包含每个待处理数组中相应promise返回的结果的数组。
注意事项
then块必须返回一个值。如果你没有这样做,那么在编译代码时Xcode不会生成错误或警告,但代码在block返回时会崩溃,并抛出BAD_ACCESS异常。
promise.then((id)^(id result) {
// No return statement here, code will crash!
});
当then块是计算的最后一步且不生成任何特定的结果时,这尤其容易犯错误;在这些情况下,块应该返回nil。
状态
该项目目前以beta代码的形式发布;然而,它经过了相当多的测试,并已在多个生产项目中使用。