我正在设计一个组件API。域本质上是异步的(调用Web服务),因此将API设计为异步是有意义的:
typedef void (^HSKBooleanResultBlock)(BOOL succeeded, NSError *error);
- (void) addConsent: (HSKSessionConsent*) consent completion: (HSKBooleanResultBlock) completion;
问题是异步API使得执行某些操作非常不方便。例如,所有测试都必须使用信号量才能等待组件完成。如果我想将几个调用链接到组件,我必须嵌套调用:
[_service addConsent:… completion:^(BOOL succeeded, NSError *error) {
if (succeeded) {
[_service addConsent:… completion:^(BOOL succeeded, NSError *error) {
// …
}];
}
}];
现在,甚至在容器中添加多个项目这些微不足道的事情也很痛苦,即使在我通过阻止调用完全没问题的情况下也是如此。一些API通过提供同步和异步API来避免此问题。例如Parse:
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {…}];
NSArray *results = [query findObjects:&error];
这很容易做到,但感觉有点像编写样板代码。
然后还有其他解决方案,例如Reactive Cocoa或Bolts,可以更容易地链接异步调用,但是太值得神奇了(对我而言!)。我也可以只提供同步调用,让调用者在后台队列上调度调用,但感觉就像API设计不好。
是其他选择还是最佳实践?