Ios 是否可以将回调转换为异步块?

Ios 是否可以将回调转换为异步块?,ios,xcode4,ios5,delegates,objective-c-blocks,Ios,Xcode4,Ios5,Delegates,Objective C Blocks,我正在为我的新产品实施。api以委托和回调为基础,成对(成功+失败),如: 我想知道是否存在将其转换为obj-c异步块的方法,因此我可以这样做: + (void)loadMetadata:(DBRestClient *)client queue:(NSOperationQueue *)queue completionHandler:(void (^)(DBMetadata*, NSError*))handler 是否存在一种可用于此的模式?或者是否需要从一开始就使用块构建库?您可以为此创建一个

我正在为我的新产品实施。api以委托和回调为基础,成对(成功+失败),如:

我想知道是否存在将其转换为obj-c异步块的方法,因此我可以这样做:

+ (void)loadMetadata:(DBRestClient *)client queue:(NSOperationQueue *)queue completionHandler:(void (^)(DBMetadata*, NSError*))handler

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

您可以为此创建一个帮助函数:

-(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

现在有一个名为“DropBlocks”的开源库,它提供了所有Dropbox iOS SDK函数的基于块的版本

充分披露:我是这个图书馆的作者。我是在对这个问题中描述的委托范例感到沮丧之后写的。请随意查看源代码,看看我是如何实现它的

-(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