Я работаю с AWS S3 в приложении iOS, используя Swift 6. У меня есть односложный класс AWSS3Manager , который обрабатывает загрузку и удаление изображений, видео и других файлов. Однако после перехода на Swift 6 я испытываю частые сбои при загрузке или удалении нескольких изображений или отдельного изображения. Проблема, по-видимому, связана с тем, что блоки завершения называются ненадлежащим образом или несколько раз, особенно во время загрузки изображения или при перегрузке через uploadimages .
@MainActor
class AWSS3Manager{
static let shared = AWSS3Manager() // 4
private init () {
initializeS3()
}
let bucketName = "Bucket_Name" //5
func initializeS3() {
if S3Key == "" || S3SecretKeyName == "" {
// if let topVC = UIApplication.topViewController() {
// topVC.showError("Something went wrong!")
// }
debugPrint("AWS initialisation Error")
return
}
let credentials = AWSStaticCredentialsProvider(accessKey: S3Key, secretKey: S3SecretKeyName)
let configuration = AWSServiceConfiguration(region: AWSRegionType.USEast1, credentialsProvider: credentials)
AWSServiceManager.default().defaultServiceConfiguration = configuration
}
func uploadImages(images: [UIImage], paths: [String], completion: @escaping(_ response: Any?, _ error: Error?) -> Void){
if images.count == 0 || InternetConnectionManager.isConnectedToNetwork() == false {
completion(nil, nil)
}
if AWSServiceManager.default().defaultServiceConfiguration == nil {
initializeS3()
let error = NSError(domain: "AWS", code: 1001, userInfo: [NSLocalizedDescriptionKey: "AWS is not initialized."])
completion(nil, error)
return
}
var counter: Int = 0
images.enumerated().forEach { i,image in
let imageName: String = String(paths.split(separator: "/").last ?? "\(UUID().uuidString).jpeg")
if let imageData = image.jpegData(compressionQuality: 0.3),
let localUrl = try? saveDataToTempFolder(data: imageData, fileName: imageName){
self.uploadfile(fileUrl: localUrl, fileName: paths, contenType: "image", progress: nil) { response, error in
counter += 1
if counter == paths.count {
completion(nil, error)
}
}
}else{
counter += 1
if counter == paths.count {
completion(nil, nil)
}
}
}
}
func deleteImage(path: String){
if AWSServiceManager.default().defaultServiceConfiguration == nil {
initializeS3()
if let topVC = UIApplication.topViewController() {
topVC.showError("Something went wrong!")
}
return
}
let s3 = AWSS3.default()
guard let deleteObjectRequest = AWSS3DeleteObjectRequest() else {
return
}
deleteObjectRequest.bucket = S3BucketName
deleteObjectRequest.key = path
s3.deleteObject(deleteObjectRequest).continueWith { (task:AWSTask) -> AnyObject? in
if let error = task.error {
debugPrint("Error occurred: \(error)")
return nil
}
debugPrint("Deleted successfully.")
return nil
}
}
func deleteAllImagesForUser(userID: String) {
if AWSServiceManager.default().defaultServiceConfiguration == nil {
initializeS3()
if let topVC = UIApplication.topViewController() {
topVC.showError("Something went wrong!")
}
return
}
let s3 = AWSS3.default()
let folderPath = "Receipts/\(userID)/"
let listObjectsRequest = AWSS3ListObjectsRequest()
listObjectsRequest?.bucket = S3BucketName
listObjectsRequest?.prefix = folderPath
s3.listObjects(listObjectsRequest!).continueWith { (task) -> AnyObject? in
if let error = task.error {
debugPrint("Error occurred while listing objects: \(error)")
return nil
}
if let listObjectsOutput = task.result, let contents = listObjectsOutput.contents {
for object in contents {
let deleteObjectRequest = AWSS3DeleteObjectRequest()
deleteObjectRequest?.bucket = S3BucketName
deleteObjectRequest?.key = object.key
s3.deleteObject(deleteObjectRequest!).continueWith { (deleteTask) -> AnyObject? in
if let error = deleteTask.error {
debugPrint("Error occurred while deleting object \(object.key ?? ""): \(error)")
} else {
debugPrint("Deleted \(object.key ?? "") successfully.")
}
return nil
}
}
} else {
debugPrint("No objects found in folder \(folderPath)")
}
return nil
}
}
// Upload video from local path url
func uploadVideo(videoUrl: URL, progress: progressBlock?, completion: completionBlock?) {
let fileName = self.getUniqueFileName(fileUrl: videoUrl)
self.uploadfile(fileUrl: videoUrl, fileName: fileName, contenType: "video", progress: progress, completion: completion)
}
// Upload auido from local path url
func uploadAudio(audioUrl: URL, progress: progressBlock?, completion: completionBlock?) {
let fileName = self.getUniqueFileName(fileUrl: audioUrl)
self.uploadfile(fileUrl: audioUrl, fileName: fileName, contenType: "audio", progress: progress, completion: completion)
}
// Upload files like Text, Zip, etc from local path url
func uploadOtherFile(fileUrl: URL, conentType: String, progress: progressBlock?, completion: completionBlock?) {
let fileName = self.getUniqueFileName(fileUrl: fileUrl)
self.uploadfile(fileUrl: fileUrl, fileName: fileName, contenType: conentType, progress: progress, completion: completion)
}
// Get unique file name
func getUniqueFileName(fileUrl: URL) -> String {
let strExt: String = "." + (URL(fileURLWithPath: fileUrl.absoluteString).pathExtension)
return (ProcessInfo.processInfo.globallyUniqueString + (strExt))
}
//MARK:- AWS file upload
// fileUrl : file local path url
// fileName : name of file, like "myimage.jpeg" "video.mov"
// contenType: file MIME type
// progress: file upload progress, value from 0 to 1, 1 for 100% complete
// completion: completion block when uplaoding is finish, you will get S3 url of upload file here
private func uploadfile(fileUrl: URL, fileName: String, contenType: String, progress: progressBlock?, completion: completionBlock?) {
if AWSServiceManager.default().defaultServiceConfiguration == nil {
initializeS3()
if let topVC = UIApplication.topViewController() {
topVC.showError("Something went wrong!")
}
let error = NSError(domain: "AWS", code: 1001, userInfo: [NSLocalizedDescriptionKey: "AWS is not initialized."])
completion?(nil, error)
return
}
// Upload progress block
let expression = AWSS3TransferUtilityUploadExpression()
expression.progressBlock = {(task, awsProgress) in
guard let uploadProgress = progress else { return }
DispatchQueue.main.async {
uploadProgress(awsProgress.fractionCompleted)
}
}
// Completion block
var completionHandler: AWSS3TransferUtilityUploadCompletionHandlerBlock?
completionHandler = { (task, error) -> Void in
DispatchQueue.main.async(execute: {
if error == nil {
let url = AWSS3.default().configuration.endpoint.url
let publicURL = url?.appendingPathComponent(self.bucketName).appendingPathComponent(fileName)
let presignedURL = self.getPreSignedURL(S3DownloadKeyName: fileName)
if let completionBlock = completion {
completionBlock(fileName, nil)
}
} else {
if let completionBlock = completion {
completionBlock(nil, error)
}
}
})
}
// Start uploading using AWSS3TransferUtility
let awsTransferUtility = AWSS3TransferUtility.default()
awsTransferUtility.uploadFile(fileUrl, bucket: bucketName, key: fileName, contentType: contenType, expression: expression, completionHandler: completionHandler).continueWith { (task) -> Any? in
if let error = task.error {
debugPrint("error is: \(error.localizedDescription)")
}
if let _ = task.result {
// your uploadTask
}
return nil
}
}
}
ссылка
https://releases.amplify.aws/aws-sdk-ios/ (spm)
2.40.1
образно /> Thread 14: excbreakpoint (code = 1, subcode = 0x101228214)
Процесс остановился в точке перерыва. < /p>
libdispatch.dylib`_dispatch_assert_queue_fail:
0x1012281a0 : sub sp, sp, #0x50
0x1012281a4 : stp x20, x19, [sp, #0x30]
0x1012281a8 : stp x29, x30, [sp, #0x40]
0x1012281ac : add x29, sp, #0x40
0x1012281b0 : adrp x8, 61
0x1012281b4 : add x8, x8, #0xf15 ; "not "
0x1012281b8 : adrp x9, 60
0x1012281bc : add x9, x9, #0x748 ; ""
0x1012281c0 : stur xzr, [x29, #-0x18]
0x1012281c4 : cmp w1, #0x0
0x1012281c8 : csel x8, x9, x8, ne
0x1012281cc : ldr x10, [x0, #0x48]
0x1012281d0 : cmp x10, #0x0
0x1012281d4 : csel x9, x9, x10, eq
0x1012281d8 : stp x9, x0, [sp, #0x10]
0x1012281dc : adrp x9, 61
0x1012281e0 : add x9, x9, #0xee4 ; "BUG IN CLIENT OF LIBDISPATCH: Assertion failed: "
0x1012281e4 : stp x9, x8, [sp]
0x1012281e8 : adrp x1, 61
0x1012281ec : add x1, x1, #0xeaf ; "%sBlock was %sexpected to execute on queue [%s (%p)]"
0x1012281f0 : sub x0, x29, #0x18
0x1012281f4 : bl 0x101262054 ; symbol stub for: asprintf
0x1012281f8 : ldur x19, [x29, #-0x18]
0x1012281fc : str x19, [sp]
0x101228200 : adrp x0, 61
0x101228204 : add x0, x0, #0xf1a ; "%s"
0x101228208 : bl 0x10125e604 ; _dispatch_log
0x10122820c : adrp x8, 93
0x101228210 : str x19, [x8, #0x1f0]
-> 0x101228214 : brk #0x1
Подробнее здесь: https://stackoverflow.com/questions/795 ... 6-possible
Сбой при загрузке или удалении изображений с помощью AWSS3Manager в Swift 6 - возможная проблема блока завершения? ⇐ IOS
Программируем под IOS
1746100581
Anonymous
Я работаю с AWS S3 в приложении iOS, используя Swift 6. У меня есть односложный класс AWSS3Manager , который обрабатывает загрузку и удаление изображений, видео и других файлов. Однако после перехода на Swift 6 я испытываю частые сбои при загрузке или удалении нескольких изображений или отдельного изображения. Проблема, по-видимому, связана с тем, что блоки завершения называются ненадлежащим образом или несколько раз, особенно во время загрузки изображения или при перегрузке через uploadimages .
@MainActor
class AWSS3Manager{
static let shared = AWSS3Manager() // 4
private init () {
initializeS3()
}
let bucketName = "Bucket_Name" //5
func initializeS3() {
if S3Key == "" || S3SecretKeyName == "" {
// if let topVC = UIApplication.topViewController() {
// topVC.showError("Something went wrong!")
// }
debugPrint("AWS initialisation Error")
return
}
let credentials = AWSStaticCredentialsProvider(accessKey: S3Key, secretKey: S3SecretKeyName)
let configuration = AWSServiceConfiguration(region: AWSRegionType.USEast1, credentialsProvider: credentials)
AWSServiceManager.default().defaultServiceConfiguration = configuration
}
func uploadImages(images: [UIImage], paths: [String], completion: @escaping(_ response: Any?, _ error: Error?) -> Void){
if images.count == 0 || InternetConnectionManager.isConnectedToNetwork() == false {
completion(nil, nil)
}
if AWSServiceManager.default().defaultServiceConfiguration == nil {
initializeS3()
let error = NSError(domain: "AWS", code: 1001, userInfo: [NSLocalizedDescriptionKey: "AWS is not initialized."])
completion(nil, error)
return
}
var counter: Int = 0
images.enumerated().forEach { i,image in
let imageName: String = String(paths[i].split(separator: "/").last ?? "\(UUID().uuidString).jpeg")
if let imageData = image.jpegData(compressionQuality: 0.3),
let localUrl = try? saveDataToTempFolder(data: imageData, fileName: imageName){
self.uploadfile(fileUrl: localUrl, fileName: paths[i], contenType: "image", progress: nil) { response, error in
counter += 1
if counter == paths.count {
completion(nil, error)
}
}
}else{
counter += 1
if counter == paths.count {
completion(nil, nil)
}
}
}
}
func deleteImage(path: String){
if AWSServiceManager.default().defaultServiceConfiguration == nil {
initializeS3()
if let topVC = UIApplication.topViewController() {
topVC.showError("Something went wrong!")
}
return
}
let s3 = AWSS3.default()
guard let deleteObjectRequest = AWSS3DeleteObjectRequest() else {
return
}
deleteObjectRequest.bucket = S3BucketName
deleteObjectRequest.key = path
s3.deleteObject(deleteObjectRequest).continueWith { (task:AWSTask) -> AnyObject? in
if let error = task.error {
debugPrint("Error occurred: \(error)")
return nil
}
debugPrint("Deleted successfully.")
return nil
}
}
func deleteAllImagesForUser(userID: String) {
if AWSServiceManager.default().defaultServiceConfiguration == nil {
initializeS3()
if let topVC = UIApplication.topViewController() {
topVC.showError("Something went wrong!")
}
return
}
let s3 = AWSS3.default()
let folderPath = "Receipts/\(userID)/"
let listObjectsRequest = AWSS3ListObjectsRequest()
listObjectsRequest?.bucket = S3BucketName
listObjectsRequest?.prefix = folderPath
s3.listObjects(listObjectsRequest!).continueWith { (task) -> AnyObject? in
if let error = task.error {
debugPrint("Error occurred while listing objects: \(error)")
return nil
}
if let listObjectsOutput = task.result, let contents = listObjectsOutput.contents {
for object in contents {
let deleteObjectRequest = AWSS3DeleteObjectRequest()
deleteObjectRequest?.bucket = S3BucketName
deleteObjectRequest?.key = object.key
s3.deleteObject(deleteObjectRequest!).continueWith { (deleteTask) -> AnyObject? in
if let error = deleteTask.error {
debugPrint("Error occurred while deleting object \(object.key ?? ""): \(error)")
} else {
debugPrint("Deleted \(object.key ?? "") successfully.")
}
return nil
}
}
} else {
debugPrint("No objects found in folder \(folderPath)")
}
return nil
}
}
// Upload video from local path url
func uploadVideo(videoUrl: URL, progress: progressBlock?, completion: completionBlock?) {
let fileName = self.getUniqueFileName(fileUrl: videoUrl)
self.uploadfile(fileUrl: videoUrl, fileName: fileName, contenType: "video", progress: progress, completion: completion)
}
// Upload auido from local path url
func uploadAudio(audioUrl: URL, progress: progressBlock?, completion: completionBlock?) {
let fileName = self.getUniqueFileName(fileUrl: audioUrl)
self.uploadfile(fileUrl: audioUrl, fileName: fileName, contenType: "audio", progress: progress, completion: completion)
}
// Upload files like Text, Zip, etc from local path url
func uploadOtherFile(fileUrl: URL, conentType: String, progress: progressBlock?, completion: completionBlock?) {
let fileName = self.getUniqueFileName(fileUrl: fileUrl)
self.uploadfile(fileUrl: fileUrl, fileName: fileName, contenType: conentType, progress: progress, completion: completion)
}
// Get unique file name
func getUniqueFileName(fileUrl: URL) -> String {
let strExt: String = "." + (URL(fileURLWithPath: fileUrl.absoluteString).pathExtension)
return (ProcessInfo.processInfo.globallyUniqueString + (strExt))
}
//MARK:- AWS file upload
// fileUrl : file local path url
// fileName : name of file, like "myimage.jpeg" "video.mov"
// contenType: file MIME type
// progress: file upload progress, value from 0 to 1, 1 for 100% complete
// completion: completion block when uplaoding is finish, you will get S3 url of upload file here
private func uploadfile(fileUrl: URL, fileName: String, contenType: String, progress: progressBlock?, completion: completionBlock?) {
if AWSServiceManager.default().defaultServiceConfiguration == nil {
initializeS3()
if let topVC = UIApplication.topViewController() {
topVC.showError("Something went wrong!")
}
let error = NSError(domain: "AWS", code: 1001, userInfo: [NSLocalizedDescriptionKey: "AWS is not initialized."])
completion?(nil, error)
return
}
// Upload progress block
let expression = AWSS3TransferUtilityUploadExpression()
expression.progressBlock = {(task, awsProgress) in
guard let uploadProgress = progress else { return }
DispatchQueue.main.async {
uploadProgress(awsProgress.fractionCompleted)
}
}
// Completion block
var completionHandler: AWSS3TransferUtilityUploadCompletionHandlerBlock?
completionHandler = { (task, error) -> Void in
DispatchQueue.main.async(execute: {
if error == nil {
let url = AWSS3.default().configuration.endpoint.url
let publicURL = url?.appendingPathComponent(self.bucketName).appendingPathComponent(fileName)
let presignedURL = self.getPreSignedURL(S3DownloadKeyName: fileName)
if let completionBlock = completion {
completionBlock(fileName, nil)
}
} else {
if let completionBlock = completion {
completionBlock(nil, error)
}
}
})
}
// Start uploading using AWSS3TransferUtility
let awsTransferUtility = AWSS3TransferUtility.default()
awsTransferUtility.uploadFile(fileUrl, bucket: bucketName, key: fileName, contentType: contenType, expression: expression, completionHandler: completionHandler).continueWith { (task) -> Any? in
if let error = task.error {
debugPrint("error is: \(error.localizedDescription)")
}
if let _ = task.result {
// your uploadTask
}
return nil
}
}
}
[b] ссылка [/b]
https://releases.amplify.aws/aws-sdk-ios/ (spm)
2.40.1
образно /> Thread 14: excbreakpoint (code = 1, subcode = 0x101228214)
Процесс остановился в точке перерыва. < /p>
libdispatch.dylib`_dispatch_assert_queue_fail:
0x1012281a0 : sub sp, sp, #0x50
0x1012281a4 : stp x20, x19, [sp, #0x30]
0x1012281a8 : stp x29, x30, [sp, #0x40]
0x1012281ac : add x29, sp, #0x40
0x1012281b0 : adrp x8, 61
0x1012281b4 : add x8, x8, #0xf15 ; "not "
0x1012281b8 : adrp x9, 60
0x1012281bc : add x9, x9, #0x748 ; ""
0x1012281c0 : stur xzr, [x29, #-0x18]
0x1012281c4 : cmp w1, #0x0
0x1012281c8 : csel x8, x9, x8, ne
0x1012281cc : ldr x10, [x0, #0x48]
0x1012281d0 : cmp x10, #0x0
0x1012281d4 : csel x9, x9, x10, eq
0x1012281d8 : stp x9, x0, [sp, #0x10]
0x1012281dc : adrp x9, 61
0x1012281e0 : add x9, x9, #0xee4 ; "BUG IN CLIENT OF LIBDISPATCH: Assertion failed: "
0x1012281e4 : stp x9, x8, [sp]
0x1012281e8 : adrp x1, 61
0x1012281ec : add x1, x1, #0xeaf ; "%sBlock was %sexpected to execute on queue [%s (%p)]"
0x1012281f0 : sub x0, x29, #0x18
0x1012281f4 : bl 0x101262054 ; symbol stub for: asprintf
0x1012281f8 : ldur x19, [x29, #-0x18]
0x1012281fc : str x19, [sp]
0x101228200 : adrp x0, 61
0x101228204 : add x0, x0, #0xf1a ; "%s"
0x101228208 : bl 0x10125e604 ; _dispatch_log
0x10122820c : adrp x8, 93
0x101228210 : str x19, [x8, #0x1f0]
-> 0x101228214 : brk #0x1
Подробнее здесь: [url]https://stackoverflow.com/questions/79599720/crash-when-uploading-or-deleting-images-with-awss3manager-in-swift-6-possible[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия