2012-02-25 16 views
5

私は新しいproject appのためにdropbox apiを実装しています。 APIは、ペアで代表者を中心に(成功を+失敗)&コールバックを、もとのようにされています。OBJ-C非同期ブロックにそれを有効にする方法を存在する場合コールバックを非同期ブロックにすることは可能ですか?

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

私は疑問に思うので、私はこれを行うことができます:

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

これに使用できるパターンが存在しますか?または、ライブラリを最初からブロックで構築する必要がありますか?

答えて

7

すべてのDropboxのiOS SDKの機能のブロックベースのバージョンを提供します「DropBlocks」と呼ばれるオープンソースのライブラリが用意されました。

https://github.com/natep/DropBlocks

全開示:私はこのライブラリの作者です。私は、この質問に記載されている代表パラダイムに不満を感じてから書きました。ソースをチェックして、実装方法を確認してください。

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 
関連する問題