BFTaskPromise
关于
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;
});
执行器
如果你想指定执行器,请使用 continueOn
、thenOn
、catchOn
和 finallyOn
。你也可以使用 continueOnMain
、thenOnMain
、catchOnMain
和 finallyOnMain
,它们使用 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.h
和 BFTask+PromiseLike.m
添加到项目的 Classes
文件夹中。
从 1.x 迁移到 2.0
在 2.0 版本中,将块参数传递给 then
/catch
的参数被改变了。一个 then
-块接受一个结果值,而一个 catch
-块接受一个错误值。
在 2.0 之前,then
和 catch
的块参数都是一个 BFTask
值。因此,如果你的 1.X 代码如下
[foo loadAsync].then(^id (BFTask *task) {
bar.title = (NSString *)task.result;
}
你必须重写它为
[foo loadAsync].then(^id (NSString *result) {
bar.title = result;
}
许可证
MIT 许可证。