2012-02-25 11 views
5

मैं अपने नए project app के लिए dropbox api लागू कर रहा हूं। एपीआई जोड़े में & कॉलबैक, प्रतिनिधियों के आसपास आधारित है (सफलता + असफल) की तरह:कॉलबैक को एसिंक ब्लॉक में बदलना संभव है?

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

मुझे आश्चर्य है अगर एक तरह से चालू करने के लिए है कि एक Obj सी async ब्लॉक में मौजूद हैं, तो मैं ऐसा कर सकता है:

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

इस तरह के पैटर्न का उपयोग कर सकते हैं जिसका उपयोग इस के लिए किया जा सकता है? या यह आवश्यक है कि पुस्तकालय शुरुआत से ब्लॉक के साथ बनाया जाए?

उत्तर

7

अब एक खुला स्रोत 'DropBlocks' नामक पुस्तकालय है कि सभी ड्रॉपबॉक्स iOS SDK कार्यों के ब्लॉक आधारित संस्करण प्रदान करता है नहीं है।

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 
संबंधित मुद्दे