2012-02-25 10 views
5

Wdrażam dropbox api dla mojego nowego project app. API jest oparty na całym delegatów & zwrotnych, w parach (sukces + uda) jak:Czy można przekształcić wywołanie zwrotne w blok asynchroniczny?

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

Zastanawiam się, czy istnieje sposób, aby włączyć, że w obj-c asynchroniczny bloku, więc mogę to zrobić:

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

Istnieje jakiś wzór, który można wykorzystać do tego? Czy konieczne jest, aby biblioteka była budowana z bloków od samego początku?

Odpowiedz

7

Jest teraz otwarta biblioteka źródło zwane „DropBlocks”, który zapewnia blokowe wersje oparte wszystkich funkcji SDK Dropbox iOS.

https://github.com/natep/DropBlocks

Pełne ujawnienie: Jestem autorem tej biblioteki. Napisałem to po tym, jak sfrustrowałem się paradygmatem delegata opisanym w tym pytaniu. Zapraszam do zapoznania się ze źródłem, aby zobaczyć, jak go zaimplementowałem.

2

Można utworzyć funkcję pomocniczą dla tego:

-(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 
Powiązane problemy