Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Swift如何在给定函数没有';未在内部调用<;x>;秒?_Ios_Swift_Amazon Web Services_Amazon S3 - Fatal编程技术网

Ios Swift如何在给定函数没有';未在内部调用<;x>;秒?

Ios Swift如何在给定函数没有';未在内部调用<;x>;秒?,ios,swift,amazon-web-services,amazon-s3,Ios,Swift,Amazon Web Services,Amazon S3,将数据(在我的例子中是图像)上载到AWS S3存储桶时,上载操作的默认超时为50分钟。我计划上传的照片非常少,每张照片上传150kb,最多9张照片,因此如果用户有一个良好的连接,最多只需几秒钟。我计划在上传过程中将UI锁定在“上传”旋转轮上,因此我需要保证成功或失败时回调,这样我就可以解锁UI,用户就可以继续了 问题是,如果用户没有连接,AWSS3TransferuilityUploadTask在50分钟超时发生之前不会给出失败回调,这对于我的用例来说显然太长了 以下是相关代码: 导入UIKit

将数据(在我的例子中是图像)上载到
AWS S3存储桶时
,上载操作的默认超时为50分钟。我计划上传的照片非常少,每张照片上传150kb,最多9张照片,因此如果用户有一个良好的连接,最多只需几秒钟。我计划在上传过程中将UI锁定在“上传”旋转轮上,因此我需要保证成功或失败时回调,这样我就可以解锁UI,用户就可以继续了

问题是,如果用户没有连接,
AWSS3TransferuilityUploadTask
在50分钟超时发生之前不会给出失败回调,这对于我的用例来说显然太长了

以下是相关代码:

导入UIKit
导入AWSCore
导入AWSS3
枚举上载ImageResult{
案例成功
案例失败
}
结构上传图像包{
let name:String
let image:UIImage
}
类图像上传器{
私有var数据包:[UploadImagePacket]=[]
私有变量currentPacketIndex=0
private let bucketName=“this-is-not-a-real-bucket-name”
专用var transferUtility:AWSS3TransferUtility{
得到{
返回AWSS3TransferUtility.default()
}
}
init(){
//为用户设置服务配置
让accessKey=“XXXXXXXXXXXXXXXXX”
让secretKey=“XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX”
let credentials=AWSStaticCredentialsProvider(accessKey:accessKey,secretKey:secretKey)
let configuration=AWSServiceConfiguration(区域:AWSRegionType.USEast2,凭据提供程序:凭据)
AWSServiceManager.default().defaultServiceConfiguration=配置
}
//将单个图像上载到S3存储桶
private func uploadImage(packet:UploadImagePacket,completion:@escaping(UploadImageResult)->Void){
让imageData=packet.image.jpegData(压缩质量:1)!
//定期调用以报告上载进度
let expression=AWSS3TransferUtilityUploadExpression()
expression.progressBlock={(任务,进度)在中
DispatchQueue.main.async(执行:{
//对于解决方案2,我将创建一个计时器,并在每次触发此闭包时重置它。
})
}
//上传完成时调用
var completionHandler:AWSS3TransferUtilityUploadCompletionHandlerBlock?
completionHandler={(任务,错误)->中的Void
DispatchQueue.main.async(执行:{
如果let error=error{
//失败
NSLog(错误。本地化描述)
完成(.failure)
}否则{
//没有失败
完成(.success)
}
})
}
//实际开始上传
uploadData(imageData,bucket:bucketName,key:packet.name,contentType:“image/jpeg”,expression:expression,completionHandler:completionHandler)。在
如果let error=task.error{
NSLog(“S3上载失败,错误:\(error.localizedDescription)”)
完成(.failure)
}
归零
}
}
//将多个图像上载到S3
func uploadImages(uPackets:[UploadImagePacket],completion:@escaping(UploadImageResult)->Void){
self.packets=数据包
currentPacketIndex=0
_上载图像(完成:完成)
}
私有函数上传图像(完成:@escaping(UploadImageResult)->Void){
//如果没有要上传的数据包,则调用completion并获得成功
guard currentPacketIndex
我确定的两个潜在解决方案是

  • 自定义此进程的AWS默认超时,或
  • 使用swift
    定时器
    /
    NSTimer
    ,而不是在[x]秒内上传未完成时调用超时,而是在[x]秒内上传未取得任何进展时调用超时
  • 用于解决方案1

    我只是没有办法做到这一点。我只能找到与下载相关的解决方案,而不是上传-最好的提示

    用于解决方案2


    理想情况下,我可以使用解决方案1,但如果没有,我发现最好的方法是创建一个
    计时器
    ,它将在x秒(大约5秒)后调用超时,并在每次调用
    表达式.progressBlock
    时重置计时器。我的问题是我发现的唯一一种方法是将
    计时器
    重置为
    无效
    ,然后重新定义计时器,考虑到调用expression.progressBlock的速度有多快,这似乎非常昂贵。

    您可以通过设置
    timeoutinetervalforresource
    并注册自定义超时来定义自定义超时