2012-02-25 15 views
5

Yeni project app için dropbox api uygulamıyorum. API çiftler halinde delegelerin etrafında (başarısını + başarısız) & geri aramalar, esaslı gibi: a obj-c zaman uyumsuz bloğun içine çevirmek için bir yol varsaBir geri çağrıyı bir uyumsuz bloğa dönüştürmek mümkün mü?

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

acaba, bu yüzden bu yapabilirdi:

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

Bunun için kullanılabilecek bir desen var mı? Yoksa kütüphanenin başlangıçtan itibaren bloklarla inşa edilmesi gerekli midir?

cevap

7

.

https://github.com/natep/DropBlocks

Tam açıklama: Ben bu kütüphanenin yazarıyım. Bu soruda açıklanan delege paradigmasıyla uğraştıktan sonra yazdım. Nasıl uygulandığımı görmek için kaynağı kontrol etmekte özgürsünüz.

2

Bunun için bir yardımcı işlev yapabilir: Tüm Dropbox iOS SDK fonksiyonlarının blok tabanlı sürümlerini sağlar 'DropBlocks' adlı bir açık kaynak kütüphanesi artık yoktur

-(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 
İlgili konular