BAPromise 3.3.7

BAPromise 3.3.7

测试已测试
语言语言 Obj-CObjective C
许可证 MIT
发布上一次发布2020年9月

Ben AllisonBen Allison维护。



BAPromise 3.3.7

  • Ben Allison

BAPromise

codecov

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取消的规则如下:

  1. 取消Promise时,保证不会调用您的完成或失败块。同时也会从Promise中移除对您的块的引用。
  2. Promise必须在完成回调完成的同一个队列上被取消。有关更多信息,请参阅有关线程的部分。
  3. 大多数情况下,您应该取消从'done'方法调用的'cancel'返回的'CancelToken'。
  4. 调用Promise对象的'cancel'方法将调用所有附加块的失败块。
  5. 底层操作是否取消取决于创建原始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; 
      }]; 
 }

以下几点值得注意:

  1. 由于XCode 7泛型的限制,无法自动补全从'then'方法返回的Promise参数化。
  2. 如果未定义失败('rejected')块,将提供一个默认实现,这将链式传递拒绝失败。
  3. 从'then'块(或'rejected'块中返回非NSError对象)将失败转换为成功,反之亦然。

安装

pod "BAPromise"