2012-02-25 37 views
5

Tôi đang triển khai dropbox api cho số project app mới của mình. Các api được dựa trên các đại biểu & callbacks, theo cặp (thành công + thất bại) như:Có thể chuyển một cuộc gọi lại thành một khối không đồng bộ không?

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

Tôi tự hỏi nếu tồn tại một cách để biến chúng thành một obj-c async khối, vì vậy tôi có thể làm điều này:

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

Tồn tại một loại mẫu có thể được sử dụng cho điều này? Hoặc là cần thiết mà thư viện được xây dựng với các khối từ đầu?

Trả lời

7

Hiện nay có là một thư viện mã nguồn mở gọi là 'DropBlocks' cung cấp các phiên bản dựa trên khối của tất cả các chức năng SDK Dropbox iOS.

https://github.com/natep/DropBlocks

Toàn bộ thông tin: Tôi là tác giả của thư viện này. Tôi đã viết nó sau khi trở nên thất vọng với mô hình đại biểu được mô tả trong câu hỏi này. Vui lòng kiểm tra nguồn để xem cách tôi triển khai nó.

2

Bạn có thể tạo một hàm helper cho việc này:

-(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 
Các vấn đề liên quan