我正在为我的新dropbox api实施project app。 api基于代表和&回调,成对(成功+失败),如:
- (void)restClient:(DBRestClient*)client loadedMetadata:(DBMetadata*)metadata;
- (void)restClient:(DBRestClient*)client loadMetadataFailedWithError:(NSError*)error;
- (void)restClient:(DBRestClient*)client loadedAccountInfo:(DBAccountInfo*)info;
- (void)restClient:(DBRestClient*)client loadAccountInfoFailedWithError:(NSError*)error;
我想知道是否存在将其转换为obj-c异步块的方法,所以我可以这样做:
+ (void)loadMetadata:(DBRestClient *)client queue:(NSOperationQueue *)queue completionHandler:(void (^)(DBMetadata*, NSError*))handler
是否存在一种可用于此的模式?或者从一开始就用块构建库是必要的吗?
答案 0 :(得分:7)
现在有一个名为“DropBlocks”的开源库,它提供了所有Dropbox iOS SDK功能的基于块的版本。
https://github.com/natep/DropBlocks
完全披露:我是这个图书馆的作者。我在对这个问题中描述的委托范式感到沮丧之后写了它。请随意查看源代码,了解我是如何实现它的。
答案 1 :(得分:2)
您可以为此创建一个辅助函数:
-(void) loadMetadataOnQueue:(NSOperationQueue *) queue completion:(void (^)(DBMetadata*, NSError*))handler
{
// assuming this is a category on DBRestClient
AsyncDelegate *delegate = [AsyncDelegate new];
delegate.metadataBlock = handler;
self.delegate = delegate;
[self loadMetadata:queue];
}
@interface AsyncDelegate
@property(readwrite, copy) void (^metadataBlock)(DBMetadata*, NSError*);
@end
@implementation AsyncDelegate
@synthesize metadataBlock;
-(void)restClient:(DBRestClient*)client loadedMetadata:(DBMetadata*)metadata
{
metadataBlock(metadata, nil);
}
- (void)restClient:(DBRestClient*)client loadMetadataFailedWithError:(NSError*)error
{
metadataBlock(nil, error);
}
end