@@ -29,30 +29,34 @@ class SFTPUploadManager: ObservableObject {
2929 self . uploadHandler = uploadHandler
3030 }
3131
32+ deinit {
33+ cancelUpload ( )
34+ }
35+
3236 func uploadFile( from localURL: URL ) {
3337 guard localURL. startAccessingSecurityScopedResource ( ) else {
3438 error = " Failed to access file "
3539 return
3640 }
37-
3841 isUploading = true
3942 currentUploadFileName = localURL. lastPathComponent
4043 uploadProgress = 0
41-
42- // Create a new SSH connection using the server from the handler
4344 if let server = uploadHandler. getServer ( ) {
4445 uploadWithSSH ( localURL: localURL, server: server)
4546 } else {
46- Task { @MainActor in
47- self . error = " Server configuration not found "
48- self . isUploading = false
47+ Task { [ weak self] in
48+ await MainActor . run {
49+ self ? . error = " Server configuration not found "
50+ self ? . isUploading = false
51+ }
4952 localURL. stopAccessingSecurityScopedResource ( )
5053 }
5154 }
5255 }
5356
5457 private func uploadWithSSH( localURL: URL , server: ServerEntity ) {
55- uploadTask = Task {
58+ uploadTask = Task { [ weak self] in
59+ guard let self = self else { return }
5660 do {
5761 defer { localURL. stopAccessingSecurityScopedResource ( ) }
5862 let destinationPath = " \( self . uploadHandler. currentPath) / \( localURL. lastPathComponent) "
@@ -126,17 +130,20 @@ class SFTPUploadManager: ObservableObject {
126130 if let server = uploadHandler. getServer ( ) {
127131 uploadFolderWithSSH ( localURL: localURL, server: server, enumeratedURLs: enumeratedURLs)
128132 } else {
129- Task { @MainActor in
130- self . error = " Server configuration not found "
131- self . isUploading = false
133+ Task { [ weak self] in
134+ await MainActor . run {
135+ self ? . error = " Server configuration not found "
136+ self ? . isUploading = false
137+ }
132138 localURL. stopAccessingSecurityScopedResource ( )
133139 }
134140 }
135141 }
136142
137143 // Add enumeratedURLs as a parameter
138144 private func uploadFolderWithSSH( localURL: URL , server: ServerEntity , enumeratedURLs: [ URL ] ) {
139- uploadTask = Task {
145+ uploadTask = Task { [ weak self] in
146+ guard let self = self else { return }
140147 do {
141148 defer {
142149 localURL. stopAccessingSecurityScopedResource ( )
@@ -207,16 +214,18 @@ class SFTPUploadManager: ObservableObject {
207214
208215 // Also disconnect the SSH connection if one exists
209216 if let connection = sshConnection {
210- Task {
217+ Task { [ weak self ] in
211218 await connection. disconnect ( )
212- self . sshConnection = nil
219+ self ? . sshConnection = nil
213220 }
214221 }
215222
216223 // Update the UI
217- Task { @MainActor in
218- self . isUploading = false
219- self . error = " Upload cancelled "
224+ Task { [ weak self] in
225+ await MainActor . run {
226+ self ? . isUploading = false
227+ self ? . error = " Upload cancelled "
228+ }
220229 }
221230 }
222231}
0 commit comments