2012-02-25 12 views
5

Sto implementando lo dropbox api per il mio nuovo project app. L'API è basata su delegati & callback, a due a due (il successo + FAIL) come:È possibile trasformare una richiamata in un blocco asincrono?

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

Mi chiedo se esiste un modo per trasformarla in un obj-c asincrone blocco, così ho potuto fare questo:

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

Esiste un tipo di modello che potrebbe essere utilizzato per questo? O è necessario che la biblioteca sia costruita con blocchi dall'inizio?

risposta

7

V'è ora una libreria open source chiamato 'DropBlocks' che fornisce versioni di blocchi a base di tutte le funzioni SDK Dropbox iOS.

https://github.com/natep/DropBlocks

Full disclosure: io sono l'autore di questa libreria. L'ho scritto dopo essere stato frustrato dal paradigma dei delegati descritto in questa domanda. Sentiti libero di controllare la fonte per vedere come l'ho implementata.

2

È possibile effettuare una funzione di supporto per questo:

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