|
@@ -89,17 +89,22 @@ typedef NSCachedURLResponse * (^AFURLSessionDataTaskWillCacheResponseBlock)(NSUR
|
|
typedef NSURL * (^AFURLSessionDownloadTaskDidFinishDownloadingBlock)(NSURLSession *session, NSURLSessionDownloadTask *downloadTask, NSURL *location);
|
|
typedef NSURL * (^AFURLSessionDownloadTaskDidFinishDownloadingBlock)(NSURLSession *session, NSURLSessionDownloadTask *downloadTask, NSURL *location);
|
|
typedef void (^AFURLSessionDownloadTaskDidWriteDataBlock)(NSURLSession *session, NSURLSessionDownloadTask *downloadTask, int64_t bytesWritten, int64_t totalBytesWritten, int64_t totalBytesExpectedToWrite);
|
|
typedef void (^AFURLSessionDownloadTaskDidWriteDataBlock)(NSURLSession *session, NSURLSessionDownloadTask *downloadTask, int64_t bytesWritten, int64_t totalBytesWritten, int64_t totalBytesExpectedToWrite);
|
|
typedef void (^AFURLSessionDownloadTaskDidResumeBlock)(NSURLSession *session, NSURLSessionDownloadTask *downloadTask, int64_t fileOffset, int64_t expectedTotalBytes);
|
|
typedef void (^AFURLSessionDownloadTaskDidResumeBlock)(NSURLSession *session, NSURLSessionDownloadTask *downloadTask, int64_t fileOffset, int64_t expectedTotalBytes);
|
|
|
|
+typedef void (^AFURLSessionTaskProgressBlock)(NSProgress *);
|
|
|
|
|
|
typedef void (^AFURLSessionTaskCompletionHandler)(NSURLResponse *response, id responseObject, NSError *error);
|
|
typedef void (^AFURLSessionTaskCompletionHandler)(NSURLResponse *response, id responseObject, NSError *error);
|
|
|
|
|
|
|
|
+
|
|
#pragma mark -
|
|
#pragma mark -
|
|
|
|
|
|
@interface AFURLSessionManagerTaskDelegate : NSObject <NSURLSessionTaskDelegate, NSURLSessionDataDelegate, NSURLSessionDownloadDelegate>
|
|
@interface AFURLSessionManagerTaskDelegate : NSObject <NSURLSessionTaskDelegate, NSURLSessionDataDelegate, NSURLSessionDownloadDelegate>
|
|
@property (nonatomic, weak) AFURLSessionManager *manager;
|
|
@property (nonatomic, weak) AFURLSessionManager *manager;
|
|
@property (nonatomic, strong) NSMutableData *mutableData;
|
|
@property (nonatomic, strong) NSMutableData *mutableData;
|
|
-@property (nonatomic, strong) NSProgress *progress;
|
|
|
|
|
|
+@property (nonatomic, strong) NSProgress *uploadProgress;
|
|
|
|
+@property (nonatomic, strong) NSProgress *downloadProgress;
|
|
@property (nonatomic, copy) NSURL *downloadFileURL;
|
|
@property (nonatomic, copy) NSURL *downloadFileURL;
|
|
@property (nonatomic, copy) AFURLSessionDownloadTaskDidFinishDownloadingBlock downloadTaskDidFinishDownloading;
|
|
@property (nonatomic, copy) AFURLSessionDownloadTaskDidFinishDownloadingBlock downloadTaskDidFinishDownloading;
|
|
|
|
+@property (nonatomic, copy) AFURLSessionTaskProgressBlock uploadProgressBlock;
|
|
|
|
+@property (nonatomic, copy) AFURLSessionTaskProgressBlock downloadProgressBlock;
|
|
@property (nonatomic, copy) AFURLSessionTaskCompletionHandler completionHandler;
|
|
@property (nonatomic, copy) AFURLSessionTaskCompletionHandler completionHandler;
|
|
@end
|
|
@end
|
|
|
|
|
|
@@ -112,24 +117,119 @@ typedef void (^AFURLSessionTaskCompletionHandler)(NSURLResponse *response, id re
|
|
}
|
|
}
|
|
|
|
|
|
self.mutableData = [NSMutableData data];
|
|
self.mutableData = [NSMutableData data];
|
|
|
|
+ self.uploadProgress = [[NSProgress alloc] initWithParent:nil userInfo:nil];
|
|
|
|
+ self.uploadProgress.totalUnitCount = NSURLSessionTransferSizeUnknown;
|
|
|
|
|
|
- self.progress = [NSProgress progressWithTotalUnitCount:0];
|
|
|
|
-
|
|
|
|
|
|
+ self.downloadProgress = [[NSProgress alloc] initWithParent:nil userInfo:nil];
|
|
|
|
+ self.downloadProgress.totalUnitCount = NSURLSessionTransferSizeUnknown;
|
|
return self;
|
|
return self;
|
|
}
|
|
}
|
|
|
|
|
|
-#pragma mark - NSURLSessionTaskDelegate
|
|
|
|
|
|
+#pragma mark - NSProgress Tracking
|
|
|
|
|
|
-- (void)URLSession:(__unused NSURLSession *)session
|
|
|
|
- task:(__unused NSURLSessionTask *)task
|
|
|
|
- didSendBodyData:(__unused int64_t)bytesSent
|
|
|
|
- totalBytesSent:(int64_t)totalBytesSent
|
|
|
|
-totalBytesExpectedToSend:(int64_t)totalBytesExpectedToSend
|
|
|
|
-{
|
|
|
|
- self.progress.totalUnitCount = totalBytesExpectedToSend;
|
|
|
|
- self.progress.completedUnitCount = totalBytesSent;
|
|
|
|
|
|
+- (void)setupProgressForTask:(NSURLSessionTask *)task {
|
|
|
|
+ __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];
|
|
|
|
+ }];
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ [task addObserver:self
|
|
|
|
+ forKeyPath:NSStringFromSelector(@selector(countOfBytesReceived))
|
|
|
|
+ options:NSKeyValueObservingOptionNew
|
|
|
|
+ context:NULL];
|
|
|
|
+ [task addObserver:self
|
|
|
|
+ forKeyPath:NSStringFromSelector(@selector(countOfBytesExpectedToReceive))
|
|
|
|
+ options:NSKeyValueObservingOptionNew
|
|
|
|
+ context:NULL];
|
|
|
|
+
|
|
|
|
+ [task addObserver:self
|
|
|
|
+ forKeyPath:NSStringFromSelector(@selector(countOfBytesSent))
|
|
|
|
+ options:NSKeyValueObservingOptionNew
|
|
|
|
+ context:NULL];
|
|
|
|
+ [task addObserver:self
|
|
|
|
+ forKeyPath:NSStringFromSelector(@selector(countOfBytesExpectedToSend))
|
|
|
|
+ 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];
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+- (void)cleanUpProgressForTask:(NSURLSessionTask *)task {
|
|
|
|
+ [task removeObserver:self forKeyPath:NSStringFromSelector(@selector(countOfBytesReceived))];
|
|
|
|
+ [task removeObserver:self forKeyPath:NSStringFromSelector(@selector(countOfBytesExpectedToReceive))];
|
|
|
|
+ [task removeObserver:self forKeyPath:NSStringFromSelector(@selector(countOfBytesSent))];
|
|
|
|
+ [task removeObserver:self forKeyPath:NSStringFromSelector(@selector(countOfBytesExpectedToSend))];
|
|
|
|
+ [self.downloadProgress removeObserver:self forKeyPath:NSStringFromSelector(@selector(fractionCompleted))];
|
|
|
|
+ [self.uploadProgress removeObserver:self forKeyPath:NSStringFromSelector(@selector(fractionCompleted))];
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context {
|
|
|
|
+ if ([object isKindOfClass:[NSURLSessionTask class]]) {
|
|
|
|
+ if ([keyPath isEqualToString:NSStringFromSelector(@selector(countOfBytesReceived))]) {
|
|
|
|
+ self.downloadProgress.completedUnitCount = [change[@"new"] longLongValue];
|
|
|
|
+ } else if ([keyPath isEqualToString:NSStringFromSelector(@selector(countOfBytesExpectedToReceive))]) {
|
|
|
|
+ self.downloadProgress.totalUnitCount = [change[@"new"] longLongValue];
|
|
|
|
+ } else if ([keyPath isEqualToString:NSStringFromSelector(@selector(countOfBytesSent))]) {
|
|
|
|
+ self.uploadProgress.completedUnitCount = [change[@"new"] longLongValue];
|
|
|
|
+ } else if ([keyPath isEqualToString:NSStringFromSelector(@selector(countOfBytesExpectedToSend))]) {
|
|
|
|
+ self.uploadProgress.totalUnitCount = [change[@"new"] longLongValue];
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ else if ([object isEqual:self.downloadProgress]) {
|
|
|
|
+ if (self.downloadProgressBlock) {
|
|
|
|
+ self.downloadProgressBlock(object);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ else if ([object isEqual:self.uploadProgress]) {
|
|
|
|
+ if (self.uploadProgressBlock) {
|
|
|
|
+ self.uploadProgressBlock(object);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+#pragma mark - NSURLSessionTaskDelegate
|
|
|
|
+
|
|
- (void)URLSession:(__unused NSURLSession *)session
|
|
- (void)URLSession:(__unused NSURLSession *)session
|
|
task:(NSURLSessionTask *)task
|
|
task:(NSURLSessionTask *)task
|
|
didCompleteWithError:(NSError *)error
|
|
didCompleteWithError:(NSError *)error
|
|
@@ -206,12 +306,6 @@ didCompleteWithError:(NSError *)error
|
|
dataTask:(__unused NSURLSessionDataTask *)dataTask
|
|
dataTask:(__unused NSURLSessionDataTask *)dataTask
|
|
didReceiveData:(NSData *)data
|
|
didReceiveData:(NSData *)data
|
|
{
|
|
{
|
|
- NSUInteger length = data.length;
|
|
|
|
- long long expectedLength = dataTask.response.expectedContentLength;
|
|
|
|
- if(expectedLength != -1) {
|
|
|
|
- self.progress.totalUnitCount = expectedLength;
|
|
|
|
- self.progress.completedUnitCount += length;
|
|
|
|
- }
|
|
|
|
[self.mutableData appendData:data];
|
|
[self.mutableData appendData:data];
|
|
}
|
|
}
|
|
|
|
|
|
@@ -236,24 +330,6 @@ didFinishDownloadingToURL:(NSURL *)location
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
-- (void)URLSession:(__unused NSURLSession *)session
|
|
|
|
- downloadTask:(__unused NSURLSessionDownloadTask *)downloadTask
|
|
|
|
- didWriteData:(__unused int64_t)bytesWritten
|
|
|
|
- totalBytesWritten:(int64_t)totalBytesWritten
|
|
|
|
-totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite
|
|
|
|
-{
|
|
|
|
- self.progress.totalUnitCount = totalBytesExpectedToWrite;
|
|
|
|
- self.progress.completedUnitCount = totalBytesWritten;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-- (void)URLSession:(__unused NSURLSession *)session
|
|
|
|
- downloadTask:(__unused NSURLSessionDownloadTask *)downloadTask
|
|
|
|
- didResumeAtOffset:(int64_t)fileOffset
|
|
|
|
-expectedTotalBytes:(int64_t)expectedTotalBytes {
|
|
|
|
- self.progress.totalUnitCount = expectedTotalBytes;
|
|
|
|
- self.progress.completedUnitCount = fileOffset;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
@end
|
|
@end
|
|
|
|
|
|
#pragma mark -
|
|
#pragma mark -
|
|
@@ -447,7 +523,7 @@ static NSString * const AFNSURLSessionTaskDidSuspendNotification = @"com.alamofi
|
|
|
|
|
|
[self.session getTasksWithCompletionHandler:^(NSArray *dataTasks, NSArray *uploadTasks, NSArray *downloadTasks) {
|
|
[self.session getTasksWithCompletionHandler:^(NSArray *dataTasks, NSArray *uploadTasks, NSArray *downloadTasks) {
|
|
for (NSURLSessionDataTask *task in dataTasks) {
|
|
for (NSURLSessionDataTask *task in dataTasks) {
|
|
- [self addDelegateForDataTask:task completionHandler:nil];
|
|
|
|
|
|
+ [self addDelegateForDataTask:task uploadProgress:nil downloadProgress:nil completionHandler:nil];
|
|
}
|
|
}
|
|
|
|
|
|
for (NSURLSessionUploadTask *uploadTask in uploadTasks) {
|
|
for (NSURLSessionUploadTask *uploadTask in uploadTasks) {
|
|
@@ -515,10 +591,14 @@ static NSString * const AFNSURLSessionTaskDidSuspendNotification = @"com.alamofi
|
|
|
|
|
|
[self.lock lock];
|
|
[self.lock lock];
|
|
self.mutableTaskDelegatesKeyedByTaskIdentifier[@(task.taskIdentifier)] = delegate;
|
|
self.mutableTaskDelegatesKeyedByTaskIdentifier[@(task.taskIdentifier)] = delegate;
|
|
|
|
+ [delegate setupProgressForTask:task];
|
|
|
|
+ [self addNotificationObserverForTask:task];
|
|
[self.lock unlock];
|
|
[self.lock unlock];
|
|
}
|
|
}
|
|
|
|
|
|
- (void)addDelegateForDataTask:(NSURLSessionDataTask *)dataTask
|
|
- (void)addDelegateForDataTask:(NSURLSessionDataTask *)dataTask
|
|
|
|
+ uploadProgress:(nullable void (^)(NSProgress *uploadProgress)) uploadProgressBlock
|
|
|
|
+ downloadProgress:(nullable void (^)(NSProgress *downloadProgress)) downloadProgressBlock
|
|
completionHandler:(void (^)(NSURLResponse *response, id responseObject, NSError *error))completionHandler
|
|
completionHandler:(void (^)(NSURLResponse *response, id responseObject, NSError *error))completionHandler
|
|
{
|
|
{
|
|
AFURLSessionManagerTaskDelegate *delegate = [[AFURLSessionManagerTaskDelegate alloc] init];
|
|
AFURLSessionManagerTaskDelegate *delegate = [[AFURLSessionManagerTaskDelegate alloc] init];
|
|
@@ -527,48 +607,28 @@ static NSString * const AFNSURLSessionTaskDidSuspendNotification = @"com.alamofi
|
|
|
|
|
|
dataTask.taskDescription = self.taskDescriptionForSessionTasks;
|
|
dataTask.taskDescription = self.taskDescriptionForSessionTasks;
|
|
[self setDelegate:delegate forTask:dataTask];
|
|
[self setDelegate:delegate forTask:dataTask];
|
|
|
|
+
|
|
|
|
+ delegate.uploadProgressBlock = uploadProgressBlock;
|
|
|
|
+ delegate.downloadProgressBlock = downloadProgressBlock;
|
|
}
|
|
}
|
|
|
|
|
|
- (void)addDelegateForUploadTask:(NSURLSessionUploadTask *)uploadTask
|
|
- (void)addDelegateForUploadTask:(NSURLSessionUploadTask *)uploadTask
|
|
- progress:(NSProgress * __autoreleasing *)progress
|
|
|
|
|
|
+ progress:(void (^)(NSProgress *uploadProgress)) uploadProgressBlock
|
|
completionHandler:(void (^)(NSURLResponse *response, id responseObject, NSError *error))completionHandler
|
|
completionHandler:(void (^)(NSURLResponse *response, id responseObject, NSError *error))completionHandler
|
|
{
|
|
{
|
|
AFURLSessionManagerTaskDelegate *delegate = [[AFURLSessionManagerTaskDelegate alloc] init];
|
|
AFURLSessionManagerTaskDelegate *delegate = [[AFURLSessionManagerTaskDelegate alloc] init];
|
|
delegate.manager = self;
|
|
delegate.manager = self;
|
|
delegate.completionHandler = completionHandler;
|
|
delegate.completionHandler = completionHandler;
|
|
|
|
|
|
- int64_t totalUnitCount = uploadTask.countOfBytesExpectedToSend;
|
|
|
|
- if(totalUnitCount == NSURLSessionTransferSizeUnknown) {
|
|
|
|
- NSString *contentLength = [uploadTask.originalRequest valueForHTTPHeaderField:@"Content-Length"];
|
|
|
|
- if(contentLength) {
|
|
|
|
- totalUnitCount = (int64_t)[contentLength longLongValue];
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- if (delegate.progress) {
|
|
|
|
- delegate.progress.totalUnitCount = totalUnitCount;
|
|
|
|
- } else {
|
|
|
|
- delegate.progress = [NSProgress progressWithTotalUnitCount:totalUnitCount];
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- delegate.progress.pausingHandler = ^{
|
|
|
|
- [uploadTask suspend];
|
|
|
|
- };
|
|
|
|
- delegate.progress.cancellationHandler = ^{
|
|
|
|
- [uploadTask cancel];
|
|
|
|
- };
|
|
|
|
-
|
|
|
|
- if (progress) {
|
|
|
|
- *progress = delegate.progress;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
uploadTask.taskDescription = self.taskDescriptionForSessionTasks;
|
|
uploadTask.taskDescription = self.taskDescriptionForSessionTasks;
|
|
|
|
|
|
[self setDelegate:delegate forTask:uploadTask];
|
|
[self setDelegate:delegate forTask:uploadTask];
|
|
|
|
+
|
|
|
|
+ delegate.uploadProgressBlock = uploadProgressBlock;
|
|
}
|
|
}
|
|
|
|
|
|
- (void)addDelegateForDownloadTask:(NSURLSessionDownloadTask *)downloadTask
|
|
- (void)addDelegateForDownloadTask:(NSURLSessionDownloadTask *)downloadTask
|
|
- progress:(NSProgress * __autoreleasing *)progress
|
|
|
|
|
|
+ progress:(void (^)(NSProgress *downloadProgress)) downloadProgressBlock
|
|
destination:(NSURL * (^)(NSURL *targetPath, NSURLResponse *response))destination
|
|
destination:(NSURL * (^)(NSURL *targetPath, NSURLResponse *response))destination
|
|
completionHandler:(void (^)(NSURLResponse *response, NSURL *filePath, NSError *error))completionHandler
|
|
completionHandler:(void (^)(NSURLResponse *response, NSURL *filePath, NSError *error))completionHandler
|
|
{
|
|
{
|
|
@@ -582,29 +642,24 @@ static NSString * const AFNSURLSessionTaskDidSuspendNotification = @"com.alamofi
|
|
};
|
|
};
|
|
}
|
|
}
|
|
|
|
|
|
- if (progress) {
|
|
|
|
- *progress = delegate.progress;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
downloadTask.taskDescription = self.taskDescriptionForSessionTasks;
|
|
downloadTask.taskDescription = self.taskDescriptionForSessionTasks;
|
|
|
|
|
|
[self setDelegate:delegate forTask:downloadTask];
|
|
[self setDelegate:delegate forTask:downloadTask];
|
|
|
|
+
|
|
|
|
+ delegate.downloadProgressBlock = downloadProgressBlock;
|
|
}
|
|
}
|
|
|
|
|
|
- (void)removeDelegateForTask:(NSURLSessionTask *)task {
|
|
- (void)removeDelegateForTask:(NSURLSessionTask *)task {
|
|
NSParameterAssert(task);
|
|
NSParameterAssert(task);
|
|
|
|
|
|
|
|
+ AFURLSessionManagerTaskDelegate *delegate = [self delegateForTask:task];
|
|
[self.lock lock];
|
|
[self.lock lock];
|
|
|
|
+ [delegate cleanUpProgressForTask:task];
|
|
|
|
+ [self removeNotificationObserverForTask:task];
|
|
[self.mutableTaskDelegatesKeyedByTaskIdentifier removeObjectForKey:@(task.taskIdentifier)];
|
|
[self.mutableTaskDelegatesKeyedByTaskIdentifier removeObjectForKey:@(task.taskIdentifier)];
|
|
[self.lock unlock];
|
|
[self.lock unlock];
|
|
}
|
|
}
|
|
|
|
|
|
-- (void)removeAllDelegates {
|
|
|
|
- [self.lock lock];
|
|
|
|
- [self.mutableTaskDelegatesKeyedByTaskIdentifier removeAllObjects];
|
|
|
|
- [self.lock unlock];
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
#pragma mark -
|
|
#pragma mark -
|
|
|
|
|
|
- (NSArray *)tasksForKeyPath:(NSString *)keyPath {
|
|
- (NSArray *)tasksForKeyPath:(NSString *)keyPath {
|
|
@@ -681,14 +736,20 @@ static NSString * const AFNSURLSessionTaskDidSuspendNotification = @"com.alamofi
|
|
- (NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)request
|
|
- (NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)request
|
|
completionHandler:(void (^)(NSURLResponse *response, id responseObject, NSError *error))completionHandler
|
|
completionHandler:(void (^)(NSURLResponse *response, id responseObject, NSError *error))completionHandler
|
|
{
|
|
{
|
|
|
|
+ return [self dataTaskWithRequest:request uploadProgress:nil downloadProgress:nil completionHandler:completionHandler];
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+- (NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)request
|
|
|
|
+ uploadProgress:(nullable void (^)(NSProgress *uploadProgress)) uploadProgressBlock
|
|
|
|
+ downloadProgress:(nullable void (^)(NSProgress *downloadProgress)) downloadProgressBlock
|
|
|
|
+ completionHandler:(nullable void (^)(NSURLResponse *response, id _Nullable responseObject, NSError * _Nullable error))completionHandler {
|
|
|
|
+
|
|
__block NSURLSessionDataTask *dataTask = nil;
|
|
__block NSURLSessionDataTask *dataTask = nil;
|
|
dispatch_sync(url_session_manager_creation_queue(), ^{
|
|
dispatch_sync(url_session_manager_creation_queue(), ^{
|
|
dataTask = [self.session dataTaskWithRequest:request];
|
|
dataTask = [self.session dataTaskWithRequest:request];
|
|
});
|
|
});
|
|
|
|
|
|
- [self addNotificationObserverForTask:dataTask];
|
|
|
|
-
|
|
|
|
- [self addDelegateForDataTask:dataTask completionHandler:completionHandler];
|
|
|
|
|
|
+ [self addDelegateForDataTask:dataTask uploadProgress:uploadProgressBlock downloadProgress:downloadProgressBlock completionHandler:completionHandler];
|
|
|
|
|
|
return dataTask;
|
|
return dataTask;
|
|
}
|
|
}
|
|
@@ -697,7 +758,7 @@ static NSString * const AFNSURLSessionTaskDidSuspendNotification = @"com.alamofi
|
|
|
|
|
|
- (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request
|
|
- (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request
|
|
fromFile:(NSURL *)fileURL
|
|
fromFile:(NSURL *)fileURL
|
|
- progress:(NSProgress * __autoreleasing *)progress
|
|
|
|
|
|
+ progress:(void (^)(NSProgress *uploadProgress)) uploadProgressBlock
|
|
completionHandler:(void (^)(NSURLResponse *response, id responseObject, NSError *error))completionHandler
|
|
completionHandler:(void (^)(NSURLResponse *response, id responseObject, NSError *error))completionHandler
|
|
{
|
|
{
|
|
__block NSURLSessionUploadTask *uploadTask = nil;
|
|
__block NSURLSessionUploadTask *uploadTask = nil;
|
|
@@ -705,22 +766,20 @@ static NSString * const AFNSURLSessionTaskDidSuspendNotification = @"com.alamofi
|
|
uploadTask = [self.session uploadTaskWithRequest:request fromFile:fileURL];
|
|
uploadTask = [self.session uploadTaskWithRequest:request fromFile:fileURL];
|
|
});
|
|
});
|
|
|
|
|
|
- [self addNotificationObserverForTask:uploadTask];
|
|
|
|
-
|
|
|
|
if (!uploadTask && self.attemptsToRecreateUploadTasksForBackgroundSessions && self.session.configuration.identifier) {
|
|
if (!uploadTask && self.attemptsToRecreateUploadTasksForBackgroundSessions && self.session.configuration.identifier) {
|
|
for (NSUInteger attempts = 0; !uploadTask && attempts < AFMaximumNumberOfAttemptsToRecreateBackgroundSessionUploadTask; attempts++) {
|
|
for (NSUInteger attempts = 0; !uploadTask && attempts < AFMaximumNumberOfAttemptsToRecreateBackgroundSessionUploadTask; attempts++) {
|
|
uploadTask = [self.session uploadTaskWithRequest:request fromFile:fileURL];
|
|
uploadTask = [self.session uploadTaskWithRequest:request fromFile:fileURL];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- [self addDelegateForUploadTask:uploadTask progress:progress completionHandler:completionHandler];
|
|
|
|
|
|
+ [self addDelegateForUploadTask:uploadTask progress:uploadProgressBlock completionHandler:completionHandler];
|
|
|
|
|
|
return uploadTask;
|
|
return uploadTask;
|
|
}
|
|
}
|
|
|
|
|
|
- (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request
|
|
- (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request
|
|
fromData:(NSData *)bodyData
|
|
fromData:(NSData *)bodyData
|
|
- progress:(NSProgress * __autoreleasing *)progress
|
|
|
|
|
|
+ progress:(void (^)(NSProgress *uploadProgress)) uploadProgressBlock
|
|
completionHandler:(void (^)(NSURLResponse *response, id responseObject, NSError *error))completionHandler
|
|
completionHandler:(void (^)(NSURLResponse *response, id responseObject, NSError *error))completionHandler
|
|
{
|
|
{
|
|
__block NSURLSessionUploadTask *uploadTask = nil;
|
|
__block NSURLSessionUploadTask *uploadTask = nil;
|
|
@@ -728,15 +787,13 @@ static NSString * const AFNSURLSessionTaskDidSuspendNotification = @"com.alamofi
|
|
uploadTask = [self.session uploadTaskWithRequest:request fromData:bodyData];
|
|
uploadTask = [self.session uploadTaskWithRequest:request fromData:bodyData];
|
|
});
|
|
});
|
|
|
|
|
|
- [self addNotificationObserverForTask:uploadTask];
|
|
|
|
-
|
|
|
|
- [self addDelegateForUploadTask:uploadTask progress:progress completionHandler:completionHandler];
|
|
|
|
|
|
+ [self addDelegateForUploadTask:uploadTask progress:uploadProgressBlock completionHandler:completionHandler];
|
|
|
|
|
|
return uploadTask;
|
|
return uploadTask;
|
|
}
|
|
}
|
|
|
|
|
|
- (NSURLSessionUploadTask *)uploadTaskWithStreamedRequest:(NSURLRequest *)request
|
|
- (NSURLSessionUploadTask *)uploadTaskWithStreamedRequest:(NSURLRequest *)request
|
|
- progress:(NSProgress * __autoreleasing *)progress
|
|
|
|
|
|
+ progress:(void (^)(NSProgress *uploadProgress)) uploadProgressBlock
|
|
completionHandler:(void (^)(NSURLResponse *response, id responseObject, NSError *error))completionHandler
|
|
completionHandler:(void (^)(NSURLResponse *response, id responseObject, NSError *error))completionHandler
|
|
{
|
|
{
|
|
__block NSURLSessionUploadTask *uploadTask = nil;
|
|
__block NSURLSessionUploadTask *uploadTask = nil;
|
|
@@ -744,9 +801,7 @@ static NSString * const AFNSURLSessionTaskDidSuspendNotification = @"com.alamofi
|
|
uploadTask = [self.session uploadTaskWithStreamedRequest:request];
|
|
uploadTask = [self.session uploadTaskWithStreamedRequest:request];
|
|
});
|
|
});
|
|
|
|
|
|
- [self addNotificationObserverForTask:uploadTask];
|
|
|
|
-
|
|
|
|
- [self addDelegateForUploadTask:uploadTask progress:progress completionHandler:completionHandler];
|
|
|
|
|
|
+ [self addDelegateForUploadTask:uploadTask progress:uploadProgressBlock completionHandler:completionHandler];
|
|
|
|
|
|
return uploadTask;
|
|
return uploadTask;
|
|
}
|
|
}
|
|
@@ -754,7 +809,7 @@ static NSString * const AFNSURLSessionTaskDidSuspendNotification = @"com.alamofi
|
|
#pragma mark -
|
|
#pragma mark -
|
|
|
|
|
|
- (NSURLSessionDownloadTask *)downloadTaskWithRequest:(NSURLRequest *)request
|
|
- (NSURLSessionDownloadTask *)downloadTaskWithRequest:(NSURLRequest *)request
|
|
- progress:(NSProgress * __autoreleasing *)progress
|
|
|
|
|
|
+ progress:(void (^)(NSProgress *downloadProgress)) downloadProgressBlock
|
|
destination:(NSURL * (^)(NSURL *targetPath, NSURLResponse *response))destination
|
|
destination:(NSURL * (^)(NSURL *targetPath, NSURLResponse *response))destination
|
|
completionHandler:(void (^)(NSURLResponse *response, NSURL *filePath, NSError *error))completionHandler
|
|
completionHandler:(void (^)(NSURLResponse *response, NSURL *filePath, NSError *error))completionHandler
|
|
{
|
|
{
|
|
@@ -763,15 +818,13 @@ static NSString * const AFNSURLSessionTaskDidSuspendNotification = @"com.alamofi
|
|
downloadTask = [self.session downloadTaskWithRequest:request];
|
|
downloadTask = [self.session downloadTaskWithRequest:request];
|
|
});
|
|
});
|
|
|
|
|
|
- [self addNotificationObserverForTask:downloadTask];
|
|
|
|
-
|
|
|
|
- [self addDelegateForDownloadTask:downloadTask progress:progress destination:destination completionHandler:completionHandler];
|
|
|
|
|
|
+ [self addDelegateForDownloadTask:downloadTask progress:downloadProgressBlock destination:destination completionHandler:completionHandler];
|
|
|
|
|
|
return downloadTask;
|
|
return downloadTask;
|
|
}
|
|
}
|
|
|
|
|
|
- (NSURLSessionDownloadTask *)downloadTaskWithResumeData:(NSData *)resumeData
|
|
- (NSURLSessionDownloadTask *)downloadTaskWithResumeData:(NSData *)resumeData
|
|
- progress:(NSProgress * __autoreleasing *)progress
|
|
|
|
|
|
+ progress:(void (^)(NSProgress *downloadProgress)) downloadProgressBlock
|
|
destination:(NSURL * (^)(NSURL *targetPath, NSURLResponse *response))destination
|
|
destination:(NSURL * (^)(NSURL *targetPath, NSURLResponse *response))destination
|
|
completionHandler:(void (^)(NSURLResponse *response, NSURL *filePath, NSError *error))completionHandler
|
|
completionHandler:(void (^)(NSURLResponse *response, NSURL *filePath, NSError *error))completionHandler
|
|
{
|
|
{
|
|
@@ -780,24 +833,18 @@ static NSString * const AFNSURLSessionTaskDidSuspendNotification = @"com.alamofi
|
|
downloadTask = [self.session downloadTaskWithResumeData:resumeData];
|
|
downloadTask = [self.session downloadTaskWithResumeData:resumeData];
|
|
});
|
|
});
|
|
|
|
|
|
- [self addNotificationObserverForTask:downloadTask];
|
|
|
|
-
|
|
|
|
- [self addDelegateForDownloadTask:downloadTask progress:progress destination:destination completionHandler:completionHandler];
|
|
|
|
|
|
+ [self addDelegateForDownloadTask:downloadTask progress:downloadProgressBlock destination:destination completionHandler:completionHandler];
|
|
|
|
|
|
return downloadTask;
|
|
return downloadTask;
|
|
}
|
|
}
|
|
|
|
|
|
#pragma mark -
|
|
#pragma mark -
|
|
-- (NSProgress *)progressForDataTask:(NSURLSessionDataTask *)dataTask {
|
|
|
|
- return [[self delegateForTask:dataTask] progress];
|
|
|
|
|
|
+- (NSProgress *)uploadProgressForTask:(NSURLSessionTask *)task {
|
|
|
|
+ return [[self delegateForTask:task] uploadProgress];
|
|
}
|
|
}
|
|
|
|
|
|
-- (NSProgress *)uploadProgressForTask:(NSURLSessionUploadTask *)uploadTask {
|
|
|
|
- return [[self delegateForTask:uploadTask] progress];
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-- (NSProgress *)downloadProgressForTask:(NSURLSessionDownloadTask *)downloadTask {
|
|
|
|
- return [[self delegateForTask:downloadTask] progress];
|
|
|
|
|
|
+- (NSProgress *)downloadProgressForTask:(NSURLSessionTask *)task {
|
|
|
|
+ return [[self delegateForTask:task] downloadProgress];
|
|
}
|
|
}
|
|
|
|
|
|
#pragma mark -
|
|
#pragma mark -
|
|
@@ -897,7 +944,6 @@ didBecomeInvalidWithError:(NSError *)error
|
|
self.sessionDidBecomeInvalid(session, error);
|
|
self.sessionDidBecomeInvalid(session, error);
|
|
}
|
|
}
|
|
|
|
|
|
- [self removeAllDelegates];
|
|
|
|
[[NSNotificationCenter defaultCenter] postNotificationName:AFURLSessionDidInvalidateNotification object:session];
|
|
[[NSNotificationCenter defaultCenter] postNotificationName:AFURLSessionDidInvalidateNotification object:session];
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1011,9 +1057,6 @@ totalBytesExpectedToSend:(int64_t)totalBytesExpectedToSend
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- AFURLSessionManagerTaskDelegate *delegate = [self delegateForTask:task];
|
|
|
|
- [delegate URLSession:session task:task didSendBodyData:bytesSent totalBytesSent:totalBytesSent totalBytesExpectedToSend:totalUnitCount];
|
|
|
|
-
|
|
|
|
if (self.taskDidSendBodyData) {
|
|
if (self.taskDidSendBodyData) {
|
|
self.taskDidSendBodyData(session, task, bytesSent, totalBytesSent, totalUnitCount);
|
|
self.taskDidSendBodyData(session, task, bytesSent, totalBytesSent, totalUnitCount);
|
|
}
|
|
}
|
|
@@ -1035,8 +1078,6 @@ didCompleteWithError:(NSError *)error
|
|
if (self.taskDidComplete) {
|
|
if (self.taskDidComplete) {
|
|
self.taskDidComplete(session, task, error);
|
|
self.taskDidComplete(session, task, error);
|
|
}
|
|
}
|
|
-
|
|
|
|
- [self removeNotificationObserverForTask:task];
|
|
|
|
}
|
|
}
|
|
|
|
|
|
#pragma mark - NSURLSessionDataDelegate
|
|
#pragma mark - NSURLSessionDataDelegate
|
|
@@ -1067,9 +1108,6 @@ didBecomeDownloadTask:(NSURLSessionDownloadTask *)downloadTask
|
|
[self setDelegate:delegate forTask:downloadTask];
|
|
[self setDelegate:delegate forTask:downloadTask];
|
|
}
|
|
}
|
|
|
|
|
|
- [self removeNotificationObserverForTask:dataTask];
|
|
|
|
- [self addNotificationObserverForTask:downloadTask];
|
|
|
|
-
|
|
|
|
if (self.dataTaskDidBecomeDownloadTask) {
|
|
if (self.dataTaskDidBecomeDownloadTask) {
|
|
self.dataTaskDidBecomeDownloadTask(session, dataTask, downloadTask);
|
|
self.dataTaskDidBecomeDownloadTask(session, dataTask, downloadTask);
|
|
}
|
|
}
|
|
@@ -1136,8 +1174,6 @@ didFinishDownloadingToURL:(NSURL *)location
|
|
if (delegate) {
|
|
if (delegate) {
|
|
[delegate URLSession:session downloadTask:downloadTask didFinishDownloadingToURL:location];
|
|
[delegate URLSession:session downloadTask:downloadTask didFinishDownloadingToURL:location];
|
|
}
|
|
}
|
|
-
|
|
|
|
- [self removeNotificationObserverForTask:downloadTask];
|
|
|
|
}
|
|
}
|
|
|
|
|
|
- (void)URLSession:(NSURLSession *)session
|
|
- (void)URLSession:(NSURLSession *)session
|
|
@@ -1146,9 +1182,6 @@ didFinishDownloadingToURL:(NSURL *)location
|
|
totalBytesWritten:(int64_t)totalBytesWritten
|
|
totalBytesWritten:(int64_t)totalBytesWritten
|
|
totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite
|
|
totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite
|
|
{
|
|
{
|
|
- AFURLSessionManagerTaskDelegate *delegate = [self delegateForTask:downloadTask];
|
|
|
|
- [delegate URLSession:session downloadTask:downloadTask didWriteData:bytesWritten totalBytesWritten:totalBytesWritten totalBytesExpectedToWrite:totalBytesExpectedToWrite];
|
|
|
|
-
|
|
|
|
if (self.downloadTaskDidWriteData) {
|
|
if (self.downloadTaskDidWriteData) {
|
|
self.downloadTaskDidWriteData(session, downloadTask, bytesWritten, totalBytesWritten, totalBytesExpectedToWrite);
|
|
self.downloadTaskDidWriteData(session, downloadTask, bytesWritten, totalBytesWritten, totalBytesExpectedToWrite);
|
|
}
|
|
}
|