Q 0.9.3

Q 0.9.3

测试已测试
语言语言 Obj-CObjective C
许可证 Apache-2.0
发布上次发布2018年5月

Julian Goacher维护。



Q 0.9.3

  • 作者:
  • Julian Goacher

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代码的形式发布;然而,它经过了相当多的测试,并已在多个生产项目中使用。