2014-04-04 1 views
0

Imgur에서 이미지를 다운로드하는 쉬운 방법을 만들고 싶습니다. 나는 종종 앱 내에서 NSURLSessionDownloadTask에 대한 설정을 모두 거치지 않고이 유스 케이스에 맞게 설정해야 할 필요가 없다는 점을 잘 알고 있으며 대신 대부분의 설정을 처리 할 수있는 서브 클래스를 사용할 수있다. .NSURLSessionDownloadTask를 서브 클래스 화하여 서비스 전용 API를 만들 수 있습니까?

NSURLSession을 특정 서비스와 쉽게 상호 작용할 수있는 방식으로 하위 클래스화할 수 있습니까?

Imgur 링크에서 이미지 ID를 자주 가져옵니다 (예 : mFJlvPf).

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

[downloadTask resume]; 

같은가요 대신, 구성을 설정하면 NSURLSession을 설정 NSURLRequest을 만들어, 그것은에서 다운로드 한 NSURL 위치에서 결과를 잡아, 나는 대신 이미지 ID를 공급하고 마을에 갈 수 단순화가 가능한가? 그렇다면 어떻게해야할까요?

답변

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)을 유지해야합니다. 따라서 대리인이 해당 블록을 기반으로 호출 할 블록을 알고 있습니다. 작업 식별자).

배경 세션을 지원하려는 경우 백그라운드 작업이 앱과 사용자 지정 개체의 표준 수명주기를 넘어서기 때문에 완전히 다른 일련의 문제가 발생합니다. 백그라운드 세션을 지원할 것인지 여부를 명시 적으로 결정할 수도 있습니다 (제외하면 쉽게 사용할 수 있습니다).

관련 문제