2014-04-04 104 views
0

說我想創建一個簡單的方法從Imgur下載圖像。我在我的應用程序中經常做到這一點,如果不需要通過NSURLSessionDownloadTask的所有設置並針對此用例進行配置,並且我可以使用可處理大部分配置的子類。是否可以繼承NSURLSessionDownloadTask以創建服務的專用API?

是否可以將NSURLSession的子類以允許與特定服務輕鬆接口的方式進行子類化?

說我經常從Imgur鏈接中獲取圖像ID,例如mFJlvPf。而是建立NSURLSession,設置它的配置,創造了NSURLRequest,從NSURL位置,它下載抓取的結果,我可以,而不是僅僅提供圖像ID和去鎮:

ImgurDownloadTask *downloadTask = [ImgurDownloadTask taskWithImageID:@"mFJlvPf" 
      progressBlock:^(CGFloat bytesWritten, CGFLoat totalBytesExpectedToBeWritten) { 
      } 
      completionBlock:^(UIImage *downloadedImage) { 
      }]; 

[downloadTask resume]; 

是這樣的簡化可能嗎?如果是這樣,我該如何去做呢?

回答

2

這確實是可能的。我會處理這個問題是這樣的:

@interface ImgurClient : NSObject 
+(instancetype) sharedClient; 
-(NSURLSessionDownloadTask*)taskWithImageID:(NSString*)imageId 
           progressBlock:(void (^)(/*TBD*/))progressBlock 
          completionHandler:(void (^)(NSURL *location, NSURLResponse *response, NSError *error))completionHandler 
@end 

@implementation ImgurClient { 
    NSURLSession* session; 
} 

+(instancetype) sharedClient { 
    static ImgurClient* _sharedClient = nil; 
    static dispatch_once_t onceToken; 

    dispatch_once(&onceToken, ^{ 
     _sharedClient = [[ImgurClient alloc] init]; 
    }); 

    return _sharedClient; 
} 

-(id) init { 
    self = [super init]; 
    if (self) { 
     // Additional initialisation, setting up NSURLSession, etc 
    } 
} 

-(NSURLSessionDownloadTask*)taskWithImageID:(NSString*)imageId 
           progressBlock:(void (^)(/*TBD*/))progressBlock 
          completionHandler:(void (^)(NSURL *location, NSURLResponse *response, NSError *error))completionHandler { 
// Build URL, store progress handler, create download task 
} 

也就是說,有一個ImgurClient對象是單身,每當你需要做的請求,你使用它像[[ImgurClient sharedClient] taskWithImageId:@"..." ....];

1

你包裝這個下載任務的複雜性的直覺是優秀的,但你可能不會繼承NSURLSessionDownloadTask,而是與NSURLSession對象開始自定義類,因爲要實施進度塊,你需要實現委託方法,並這些與任務相關的委託方法在會話的委託中實現。

因此,將您的NSURLSession包裝在一個對象中,並將您的自定義工廠方法與其進度/完成塊放在一起。如果您要提供任務特定的進度/完成塊,那麼您還必須在任務標識符和這些塊之間保留一些映射(例如,通過NSMutableDictionary)(這樣您的委託人就可以根據任務標識符)。如果您打算支持後臺會話,那麼會引入一整套不同的挑戰(因爲後臺任務在您的應用程序和自定義對象的標準生命週期之外仍然存在)。您可能需要明確決定是否要支持後臺會話(如果您排除這些會話,您的生活將會更輕鬆)。

相關問題