BAPromise
Swift & Objective C Promise Library
这是一个Objective C的Promise库。它是一个轻量级的库,不引入任何附加依赖,并且添加的复杂度非常小。
什么是Promise?
如果您不熟悉Promise,最简单的方法是将其视为一个用于完成/失败的托管对象。您不需要传递完成和失败代码块,API可以返回一个Promise,您可以将这些代码块附加到Promise上。Promise对象可以分配多个完成代码块,可以取消,并且可以通过代码块转换为另一个Promise。
示例
这些示例关注的是如何使用返回Promise的API。这里没有涵盖创建Promise对象,为了简洁考虑。
作为完成/失败块的替代品
BAPromise *promise = [someObject methodThatReturnsPromise];
[[promise done:^(id successObject) {
self.textLabel = (NSString *)successObject;
} rejected:^(NSError *error) {
self.textLabel = error.localizedDescription;
}];
通常您知道传递到完成块中的内容,因此以下方式更易读:
BAPromise *promise = [someObject methodThatReturnsPromise];
[[promise done:^(NSString *successObject) {
self.textLabel = successObject;
} rejected:^(NSError *error) {
self.textLabel = error.localizedDescription;
}];
模板化
可以使用XCode 7新增的特性,使用完成块参数来可选地对Promise对象进行模板化。这使得使用错误的块参数成为语法错误,同时也使得自动补全能够按预期工作。上面的示例可以改为以下形式。
BAPromise<NSString *> *promise = [someObject methodThatReturnsPromise];
[[promise done:^(NSString *successObject) {
self.textLabel = (NSString *)successObject; }
rejected:^(NSError *error) {
self.textLabel = error.localizedDescription;
}];
取消
Promise可以被取消。Promise取消的规则如下:
- 取消Promise时,保证不会调用您的完成或失败块。同时也会从Promise中移除对您的块的引用。
- Promise必须在完成回调完成的同一个队列上被取消。有关更多信息,请参阅有关线程的部分。
- 大多数情况下,您应该取消从'done'方法调用的'cancel'返回的'CancelToken'。
- 调用Promise对象的'cancel'方法将调用所有附加块的失败块。
- 底层操作是否取消取决于创建原始Promise的代码的实现。
Promise链式调用
完成块API的一个常用惯例是实现一个接受完成/失败块的方法,然后调用另一个需要完成/失败块的其他API。这是通过Promise库中的'then'方法实现的。以下是一个简单的示例。
- (BAPromise<CustomObject *> *)promiseForCustomObject {
BAPromise<NSDictionary *> *promise = [someObject promiseForJSON];
return [promise then:^id(NSDictionary *dictionary) {
CustomObject *object = [[CustomObject alloc] initWithDictionary:dictionary]; return object;
}];
}
以下几点值得注意:
- 由于XCode 7泛型的限制,无法自动补全从'then'方法返回的Promise参数化。
- 如果未定义失败('rejected')块,将提供一个默认实现,这将链式传递拒绝失败。
- 从'then'块(或'rejected'块中返回非NSError对象)将失败转换为成功,反之亦然。
安装
pod "BAPromise"