设计混合同步/异步API?

时间:2014-05-19 13:50:54

标签: objective-c multithreading api

我正在设计一个组件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 CocoaBolts,可以更容易地链接异步调用,但是太值得神奇了(对我而言!)。我也可以只提供同步调用,让调用者在后台队列上调度调用,但感觉就像API设计不好。

是其他选择还是最佳实践?

0 个答案:

没有答案