TwistedOakCollapsingFutures 1.0.0

TwistedOakCollapsingFutures 1.0.0

测试已测试
语言语言 Obj-CObjective C
许可证 BSD
发布最新发布2014年12月

无人认领 管理。



  • Craig Gidney

Collapsing Futures

这是一个在 Objective-C 中实现 futures 的库,具有以下特点:

  • 类型:使用 TOCFuture 表示最终结果,使用 TOCCancelToken 来传播取消通知,使用 TOCFutureSource 产生并控制最终结果,以及使用 TOCCancelTokenSource 产生并控制取消令牌。
  • 自动折叠:无需担心忘记解包或折叠双向 eventual future。一个 [TOCFuture futureWithResult:[TOCFuture futureWithResult:@1]] 自动转换为 [TOCFuture futureWithResult:@1]
  • 粘连主线程:从主线程注册的回调将在执行之前返回到主线程。这使得 UI 的工作变得更加容易。
  • 可取消操作:所有异步操作都有可以被 TOCCancelToken 取消变体的 until:unless: 参数传递给操作。
  • 永生性检测:通过消耗 futures 和令牌(但生产者仍然需要小心)不可能创建新的空间泄漏。如果引用循环不涉及令牌或 future 的源,则当源被释放时将断开。
  • 文档:对每个方法和类型提供了实用的 doc 注释,不仅仅重复名称,还覆盖了边缘情况,在某些情况下还提供了基本用法提示。不过还没有“入门”指南。

近期更改

  • 版本 1。
  • 弃用了 "TwistedOakCollapsingFutures.h",改为 "CollapsingFutures.h"。
  • 现在 futures 是可比较的(通过当前状态然后是通过将最终状态并具有相同值)。

安装

方法 #1: CocoaPods

  1. 在您的 Podfile 中,添加 pod 'TwistedOakCollapsingFutures', '~> 1.0'
  2. 从项目目录运行 pod install
  3. #import "CollapsingFutures.h" 在您想要使用 futures、取消令牌或它们的类别方法的地方

方法 #2: 手动

  1. 下载其中之一 发行版,或者克隆仓库
  2. 将 src/ 文件夹中的源文件复制到您的项目中
  3. 启用 ARC
  4. #import "CollapsingFutures.h" 在您想要使用 futures、取消令牌或它们的类别方法的地方

用法

外部内容

使用 Future

以下代码是一个如何使TOCFuture进行某种操作的示例。使用thenDo在未来的成功时执行某些操作,并使用catchDo在失败时执行某些操作(也有finallyDo用于清理)。

#import "CollapsingFutures.h"

// ask for the address book, which is asynchronous because IOS may ask the user to allow it
TOCFuture *futureAddressBook = SomeUtilityClass.asyncGetAddressBook;

// if the user refuses access to the address book (or something else goes wrong), log the problem
[futureAddressBook catchDo:^(id error) {
    NSLog("There was an error (%@) getting the address book.", error);
}];

// if the user allowed access, use the address book
[futureAddressBook thenDo:^(id arcAddressBook) {
    ABAddressBookRef addressBook = (__bridge ABAddressBookRef)arcAddressBook;

    ... do stuff with addressBook ...
}];

创建一个Future

上面的示例中,asyncGetAddressBook方法是如何控制返回的未来的?

在简单的情况下,即结果已经知道,您可以使用TOCFuture futureWithResult:TOCFuture futureWithFailure

当结果不是马上就知道时,使用类TOCFutureSource。它有一个future属性,在调用源对象的trySetResulttrySetFailure方法后完成。

这是asyncGetAddressBook实现的示例

#import "CollapsingFutures.h"

+(TOCFuture *) asyncGetAddressBook {
    CFErrorRef creationError = nil;
    ABAddressBookRef addressBookRef = ABAddressBookCreateWithOptions(NULL, &creationError);

    // did we fail right away? Then return an already-failed future
    if (creationError != nil) {
        return [TOCFuture futureWithFailure:(__bridge_transfer id)creationError];
    }

    // we need to make an asynchronous call, so we'll use a future source
    // that way we can return its future right away and fill it in later
    TOCFutureSource *resultSource = [FutureSource new];

    id arcAddressBook = (__bridge_transfer id)addressBookRef; // retain the address book in ARC land
    ABAddressBookRequestAccessWithCompletion(addressBookRef, ^(bool granted, CFErrorRef requestAccessError) {
        // time to fill in the future we returned
        if (granted) {
            [resultSource trySetResult:arcAddressBook];
        } else {
            [resultSource trySetFailure:(__bridge id)requestAccessError];
        }
    });

    return resultSource.future;
}

Future链式操作

创建和使用未来很有用,但正是像then:toc_thenAll这样的转换方法赋予了它们强大的功能。它们既能消费也能生产未来的对象,使得连接复杂的异步序列看起来非常简单。

#import "CollapsingFutures.h"

+(TOCFuture *) sumOfFutures:(NSArray*)arrayOfFuturesOfNumbers {
    // we want all of the values to be ready before we bother summing
    TOCFuture* futureOfArrayOfNumbers = arrayOfFuturesOfNumbers.toc_thenAll;

    // once the array of values is ready, add up its entries to get the sum
    TOCFuture* futureSum = [futureOfArrayOfNumbers then:^(NSArray* numbers) {
        double total = 0;
        for (NSNumber* number in numbers) {
            total += number.doubleValue;
        }
        return @(total);
    }];

    // this future will eventually contain the sum of the eventual numbers in the input array
    // if any of the evetnual numbers fails, this future will end up failing as well
    return futureSum;
}

一旦未来准备就绪,就设置转换发生的可能性,这使得您能够编写真正的异步代码,不阻塞宝贵的线程,并且很少需要样板代码和直观地传播失败。

开发

如何构建

  1. 获取源代码将这些git仓库克隆到您的机器上

  2. 获取依赖项安装cocoa pods。从项目目录中运行pod install

  3. 打开工作空间:使用XCode打开CollapsingFutures.xworkspace(不是项目,而是工作空间)。运行测试并确认测试通过。