可以将回调转换为异步块吗?

时间:2012-02-25 18:04:30

标签: ios xcode4 ios5 delegates objective-c-blocks

我正在为我的新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

是否存在一种可用于此的模式?或者从一开始就用块构建库是必要的吗?

2 个答案:

答案 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