@@ -29,7 +29,7 @@ open class URLSessionTask : NSObject, NSCopying {
29
29
fileprivate var suspendCount = 1
30
30
fileprivate var easyHandle : _EasyHandle !
31
31
fileprivate var totalDownloaded = 0
32
- fileprivate unowned let session : URLSessionProtocol
32
+ fileprivate var session : URLSessionProtocol ! //change to nil when task completes
33
33
fileprivate let body : _Body
34
34
fileprivate let tempFileURL : URL
35
35
@@ -62,6 +62,10 @@ open class URLSessionTask : NSObject, NSCopying {
62
62
}
63
63
if case . taskCompleted = internalState {
64
64
updateTaskState ( )
65
+ guard let s = session as? URLSession else { fatalError ( ) }
66
+ s. workQueue. async {
67
+ s. taskRegistry. remove ( self )
68
+ }
65
69
}
66
70
}
67
71
}
@@ -825,16 +829,19 @@ extension URLSessionTask {
825
829
guard case . transferCompleted( response: let response, bodyDataDrain: let bodyDataDrain) = internalState else {
826
830
fatalError ( " Trying to complete the task, but its transfer isn't complete. " )
827
831
}
828
- internalState = . taskCompleted
829
832
self . response = response
833
+
834
+ //because we deregister the task with the session on internalState being set to taskCompleted
835
+ //we need to do the latter after the delegate/handler was notified/invoked
830
836
switch session. behaviour ( for: self ) {
831
837
case . taskDelegate( let delegate) :
832
838
guard let s = session as? URLSession else { fatalError ( ) }
833
839
s. delegateQueue. addOperation {
834
840
delegate. urlSession ( s, task: self , didCompleteWithError: nil )
841
+ self . internalState = . taskCompleted
835
842
}
836
843
case . noDelegate:
837
- break
844
+ internalState = . taskCompleted
838
845
case . dataCompletionHandler( let completion) :
839
846
guard case . inMemory( let bodyData) = bodyDataDrain else {
840
847
fatalError ( " Task has data completion handler, but data drain is not in-memory. " )
@@ -849,6 +856,8 @@ extension URLSessionTask {
849
856
850
857
s. delegateQueue. addOperation {
851
858
completion ( data, response, nil )
859
+ self . internalState = . taskCompleted
860
+ self . session = nil
852
861
}
853
862
case . downloadCompletionHandler( let completion) :
854
863
guard case . toFile( let url, let fileHandle? ) = bodyDataDrain else {
@@ -861,6 +870,8 @@ extension URLSessionTask {
861
870
862
871
s. delegateQueue. addOperation {
863
872
completion ( url, response, nil )
873
+ self . internalState = . taskCompleted
874
+ self . session = nil
864
875
}
865
876
866
877
}
@@ -869,24 +880,26 @@ extension URLSessionTask {
869
880
guard case . transferFailed = internalState else {
870
881
fatalError ( " Trying to complete the task, but its transfer isn't complete / failed. " )
871
882
}
872
- internalState = . taskCompleted
873
883
switch session. behaviour ( for: self ) {
874
884
case . taskDelegate( let delegate) :
875
885
guard let s = session as? URLSession else { fatalError ( ) }
876
886
s. delegateQueue. addOperation {
877
887
delegate. urlSession ( s, task: self , didCompleteWithError: error as Error )
888
+ self . internalState = . taskCompleted
878
889
}
879
890
case . noDelegate:
880
- break
891
+ internalState = . taskCompleted
881
892
case . dataCompletionHandler( let completion) :
882
893
guard let s = session as? URLSession else { fatalError ( ) }
883
894
s. delegateQueue. addOperation {
884
895
completion ( nil , nil , error)
896
+ self . internalState = . taskCompleted
885
897
}
886
898
case . downloadCompletionHandler( let completion) :
887
899
guard let s = session as? URLSession else { fatalError ( ) }
888
900
s. delegateQueue. addOperation {
889
901
completion ( nil , nil , error)
902
+ self . internalState = . taskCompleted
890
903
}
891
904
}
892
905
}
0 commit comments