Ios 是否可以将回调转换为异步块?
我正在为我的新产品实施。api以委托和回调为基础,成对(成功+失败),如: 我想知道是否存在将其转换为obj-c异步块的方法,因此我可以这样做: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 是否存在一种可用于此的模式?或者是否需要从一开始就使用块构建库?您可以为此创建一个
+ (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