BFTaskPromise 2.2.0

BFTaskPromise 2.2.0

测试已测试
Lang语言 Obj-CObjective C
许可证 未知
发布最后发布2018年9月

Hironori Ichimiya 维护。



  • Hironori Ichimiya

BFTaskPromise

Build Status Coverage Status

关于

Bolts-ObjC 中的 BFTask 类的 Objective-C 分类。

使用这个分类,你可以

  • 使用点符号链式调用任务,类似于 JavaScript 的 Promise 语法(无需计数括号!)
  • 编写只会在错误情况下被调用的 catch 块。
  • 编写不会改变结果值(除非块执行失败)的 finally 块。

示例

[self countUsersAsync].continueWith(^id (BFTask *task) {
    // this block is called regardless of the success or failure
    NSNumber *count = task.result;
    if ([count intValue] <= 0) {
        return [BFTask taskWithError:[NSError errorWithDomain:@"MyDomain"
                                                         code:-1
                                                     userInfo:nil]];
    } else {
        return [self makeTotalUserStringAsync:count];
    }
}).then(^id (NSString *totalUserString) {
    // this block is skipped when the previous task is failed.
    [self showMessage:totalUserString];
    return nil;
}).catch(^id (NSError *error) {
    // this block is called in error case.
    [self showErrorMessage:error];
    return nil;
}).finally(^BFTask * (){
    [self updateList];
    return nil;
});

执行器

如果你想指定执行器,请使用 continueOnthenOncatchOnfinallyOn。你也可以使用 continueOnMainthenOnMaincatchOnMainfinallyOnMain,它们使用 mainThreadExecutor

[User findAllAsync].catchOn([BFExecutor mainThreadExecutor], ^id (NSError *error) {
    [self showAlert:error];
});

// same as above
[User findAllAsync].catchOnMain(^id (NSError *error) {
    [self showAlert:error];
});

这不是一个 Promise

确切地说,Bolts 的任务不是一个 Promise,所以这也不是一个 Promise。这个项目的目的是使任务链更容易读取。

讨厌点号表示法?

如果你认为点号表示法不好但仍然需要 catch 和/或 finally,你仍然可以使用 catchWithExecutor:withBlock:finallyWithExecutor:withBlock:。它们是普通的方法。

说句实话,我基本上讨厌乘号表示法用于方法。我希望只用于属性。我更喜欢使用中括号表示法来表示普通方法。但任务链对我来说是一个特殊情况。这很不寻常。我觉得任务链不是一个嵌套的方法调用,而是一种流程控制。

安装

使用 CocoaPods

在你的 Podfile 中写入以下行

pod 'BFTaskPromise', '~> 2.0'

手动

BFTask+PromiseLike.hBFTask+PromiseLike.m 添加到项目的 Classes 文件夹中。

从 1.x 迁移到 2.0

在 2.0 版本中,将块参数传递给 then/catch 的参数被改变了。一个 then-块接受一个结果值,而一个 catch-块接受一个错误值。

在 2.0 之前,thencatch 的块参数都是一个 BFTask 值。因此,如果你的 1.X 代码如下

[foo loadAsync].then(^id (BFTask *task) {
    bar.title = (NSString *)task.result;
}

你必须重写它为

[foo loadAsync].then(^id (NSString *result) {
    bar.title = result;
}

许可证

MIT 许可证。