|
@@ -112,6 +112,7 @@ typedef void (^AFURLSessionTaskCompletionHandler)(NSURLResponse *response, id re
|
|
|
#pragma mark -
|
|
|
|
|
|
@interface AFURLSessionManagerTaskDelegate : NSObject <NSURLSessionTaskDelegate, NSURLSessionDataDelegate, NSURLSessionDownloadDelegate>
|
|
|
+- (instancetype)initWithTask:(NSURLSessionTask *)task;
|
|
|
@property (nonatomic, weak) AFURLSessionManager *manager;
|
|
|
@property (nonatomic, strong) NSMutableData *mutableData;
|
|
|
@property (nonatomic, strong) NSProgress *uploadProgress;
|
|
@@ -125,78 +126,48 @@ typedef void (^AFURLSessionTaskCompletionHandler)(NSURLResponse *response, id re
|
|
|
|
|
|
@implementation AFURLSessionManagerTaskDelegate
|
|
|
|
|
|
-- (instancetype)init {
|
|
|
+- (instancetype)initWithTask:(NSURLSessionTask *)task {
|
|
|
self = [super init];
|
|
|
if (!self) {
|
|
|
return nil;
|
|
|
}
|
|
|
-
|
|
|
- self.mutableData = [NSMutableData data];
|
|
|
- self.uploadProgress = [[NSProgress alloc] initWithParent:nil userInfo:nil];
|
|
|
- self.uploadProgress.totalUnitCount = NSURLSessionTransferSizeUnknown;
|
|
|
-
|
|
|
- self.downloadProgress = [[NSProgress alloc] initWithParent:nil userInfo:nil];
|
|
|
- self.downloadProgress.totalUnitCount = NSURLSessionTransferSizeUnknown;
|
|
|
- return self;
|
|
|
-}
|
|
|
-
|
|
|
-#pragma mark - NSProgress Tracking
|
|
|
-
|
|
|
-- (void)setupProgressForTask:(NSURLSessionTask *)task {
|
|
|
+
|
|
|
+ _mutableData = [NSMutableData data];
|
|
|
+ _uploadProgress = [[NSProgress alloc] initWithParent:nil userInfo:nil];
|
|
|
+ _downloadProgress = [[NSProgress alloc] initWithParent:nil userInfo:nil];
|
|
|
+
|
|
|
__weak __typeof__(task) weakTask = task;
|
|
|
-
|
|
|
- self.uploadProgress.totalUnitCount = task.countOfBytesExpectedToSend;
|
|
|
- self.downloadProgress.totalUnitCount = task.countOfBytesExpectedToReceive;
|
|
|
- [self.uploadProgress setCancellable:YES];
|
|
|
- [self.uploadProgress setCancellationHandler:^{
|
|
|
- __typeof__(weakTask) strongTask = weakTask;
|
|
|
- [strongTask cancel];
|
|
|
- }];
|
|
|
- [self.uploadProgress setPausable:YES];
|
|
|
- [self.uploadProgress setPausingHandler:^{
|
|
|
- __typeof__(weakTask) strongTask = weakTask;
|
|
|
- [strongTask suspend];
|
|
|
- }];
|
|
|
- if ([self.uploadProgress respondsToSelector:@selector(setResumingHandler:)]) {
|
|
|
- [self.uploadProgress setResumingHandler:^{
|
|
|
- __typeof__(weakTask) strongTask = weakTask;
|
|
|
- [strongTask resume];
|
|
|
- }];
|
|
|
- }
|
|
|
-
|
|
|
- [self.downloadProgress setCancellable:YES];
|
|
|
- [self.downloadProgress setCancellationHandler:^{
|
|
|
- __typeof__(weakTask) strongTask = weakTask;
|
|
|
- [strongTask cancel];
|
|
|
- }];
|
|
|
- [self.downloadProgress setPausable:YES];
|
|
|
- [self.downloadProgress setPausingHandler:^{
|
|
|
- __typeof__(weakTask) strongTask = weakTask;
|
|
|
- [strongTask suspend];
|
|
|
- }];
|
|
|
-
|
|
|
- if ([self.downloadProgress respondsToSelector:@selector(setResumingHandler:)]) {
|
|
|
- [self.downloadProgress setResumingHandler:^{
|
|
|
- __typeof__(weakTask) strongTask = weakTask;
|
|
|
- [strongTask resume];
|
|
|
- }];
|
|
|
+ for (NSProgress *progress in @[ _uploadProgress, _downloadProgress ])
|
|
|
+ {
|
|
|
+ progress.totalUnitCount = NSURLSessionTransferSizeUnknown;
|
|
|
+ progress.cancellable = YES;
|
|
|
+ progress.cancellationHandler = ^{
|
|
|
+ [weakTask cancel];
|
|
|
+ };
|
|
|
+ progress.pausable = YES;
|
|
|
+ progress.pausingHandler = ^{
|
|
|
+ [weakTask suspend];
|
|
|
+ };
|
|
|
+ if ([progress respondsToSelector:@selector(setResumingHandler:)]) {
|
|
|
+ progress.resumingHandler = ^{
|
|
|
+ [weakTask resume];
|
|
|
+ };
|
|
|
+ }
|
|
|
+ [progress addObserver:self
|
|
|
+ forKeyPath:NSStringFromSelector(@selector(fractionCompleted))
|
|
|
+ options:NSKeyValueObservingOptionNew
|
|
|
+ context:NULL];
|
|
|
}
|
|
|
-
|
|
|
- [self.downloadProgress addObserver:self
|
|
|
- forKeyPath:NSStringFromSelector(@selector(fractionCompleted))
|
|
|
- options:NSKeyValueObservingOptionNew
|
|
|
- context:NULL];
|
|
|
- [self.uploadProgress addObserver:self
|
|
|
- forKeyPath:NSStringFromSelector(@selector(fractionCompleted))
|
|
|
- options:NSKeyValueObservingOptionNew
|
|
|
- context:NULL];
|
|
|
+ return self;
|
|
|
}
|
|
|
|
|
|
-- (void)cleanUpProgressForTask:(NSURLSessionTask *)task {
|
|
|
+- (void)dealloc {
|
|
|
[self.downloadProgress removeObserver:self forKeyPath:NSStringFromSelector(@selector(fractionCompleted))];
|
|
|
[self.uploadProgress removeObserver:self forKeyPath:NSStringFromSelector(@selector(fractionCompleted))];
|
|
|
}
|
|
|
|
|
|
+#pragma mark - NSProgress Tracking
|
|
|
+
|
|
|
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context {
|
|
|
if ([object isEqual:self.downloadProgress]) {
|
|
|
if (self.downloadProgressBlock) {
|
|
@@ -599,7 +570,6 @@ static NSString * const AFNSURLSessionTaskDidSuspendNotification = @"com.alamofi
|
|
|
|
|
|
[self.lock lock];
|
|
|
self.mutableTaskDelegatesKeyedByTaskIdentifier[@(task.taskIdentifier)] = delegate;
|
|
|
- [delegate setupProgressForTask:task];
|
|
|
[self addNotificationObserverForTask:task];
|
|
|
[self.lock unlock];
|
|
|
}
|
|
@@ -609,7 +579,7 @@ static NSString * const AFNSURLSessionTaskDidSuspendNotification = @"com.alamofi
|
|
|
downloadProgress:(nullable void (^)(NSProgress *downloadProgress)) downloadProgressBlock
|
|
|
completionHandler:(void (^)(NSURLResponse *response, id responseObject, NSError *error))completionHandler
|
|
|
{
|
|
|
- AFURLSessionManagerTaskDelegate *delegate = [[AFURLSessionManagerTaskDelegate alloc] init];
|
|
|
+ AFURLSessionManagerTaskDelegate *delegate = [[AFURLSessionManagerTaskDelegate alloc] initWithTask:dataTask];
|
|
|
delegate.manager = self;
|
|
|
delegate.completionHandler = completionHandler;
|
|
|
|
|
@@ -624,7 +594,7 @@ static NSString * const AFNSURLSessionTaskDidSuspendNotification = @"com.alamofi
|
|
|
progress:(void (^)(NSProgress *uploadProgress)) uploadProgressBlock
|
|
|
completionHandler:(void (^)(NSURLResponse *response, id responseObject, NSError *error))completionHandler
|
|
|
{
|
|
|
- AFURLSessionManagerTaskDelegate *delegate = [[AFURLSessionManagerTaskDelegate alloc] init];
|
|
|
+ AFURLSessionManagerTaskDelegate *delegate = [[AFURLSessionManagerTaskDelegate alloc] initWithTask:uploadTask];
|
|
|
delegate.manager = self;
|
|
|
delegate.completionHandler = completionHandler;
|
|
|
|
|
@@ -640,7 +610,7 @@ static NSString * const AFNSURLSessionTaskDidSuspendNotification = @"com.alamofi
|
|
|
destination:(NSURL * (^)(NSURL *targetPath, NSURLResponse *response))destination
|
|
|
completionHandler:(void (^)(NSURLResponse *response, NSURL *filePath, NSError *error))completionHandler
|
|
|
{
|
|
|
- AFURLSessionManagerTaskDelegate *delegate = [[AFURLSessionManagerTaskDelegate alloc] init];
|
|
|
+ AFURLSessionManagerTaskDelegate *delegate = [[AFURLSessionManagerTaskDelegate alloc] initWithTask:downloadTask];
|
|
|
delegate.manager = self;
|
|
|
delegate.completionHandler = completionHandler;
|
|
|
|
|
@@ -660,9 +630,7 @@ static NSString * const AFNSURLSessionTaskDidSuspendNotification = @"com.alamofi
|
|
|
- (void)removeDelegateForTask:(NSURLSessionTask *)task {
|
|
|
NSParameterAssert(task);
|
|
|
|
|
|
- AFURLSessionManagerTaskDelegate *delegate = [self delegateForTask:task];
|
|
|
[self.lock lock];
|
|
|
- [delegate cleanUpProgressForTask:task];
|
|
|
[self removeNotificationObserverForTask:task];
|
|
|
[self.mutableTaskDelegatesKeyedByTaskIdentifier removeObjectForKey:@(task.taskIdentifier)];
|
|
|
[self.lock unlock];
|
|
@@ -711,13 +679,11 @@ static NSString * const AFNSURLSessionTaskDidSuspendNotification = @"com.alamofi
|
|
|
#pragma mark -
|
|
|
|
|
|
- (void)invalidateSessionCancelingTasks:(BOOL)cancelPendingTasks {
|
|
|
- dispatch_async(dispatch_get_main_queue(), ^{
|
|
|
- if (cancelPendingTasks) {
|
|
|
- [self.session invalidateAndCancel];
|
|
|
- } else {
|
|
|
- [self.session finishTasksAndInvalidate];
|
|
|
- }
|
|
|
- });
|
|
|
+ if (cancelPendingTasks) {
|
|
|
+ [self.session invalidateAndCancel];
|
|
|
+ } else {
|
|
|
+ [self.session finishTasksAndInvalidate];
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
#pragma mark -
|