我正在使用moya通过使用OperationQueue来控制maxConcurrentOperationCount来上传许多图像。假设我有100张图片,每次上传5张图片。 Alamorefire超时设置为10秒。
上载一张图像非常快,令人不安地触发了超时。但是,当我使用以下方法上传100张图像时,即使使用多线程,也会触发超时。为什么? 谢谢!
queue = OperationQueue()
queue.maxConcurrentOperationCount = 5
var i = 0
for image in photos {
autoreleasepool {
let operation:BlockOperation = BlockOperation(block: {
[weak self] in
guard let strongSelf = self else {return}
print("hyl cur thread %@", Thread.current)
strongSelf.uploadImage(image)
return
})
i += 1
queue.addOperation(operation)
}
}
private func uploadImage(_ image: UIImage) {
AladdinProvider.rx.request(.upload(access_token: UserInfo.instance.access_token!, file_name: "file_name", data: image)).asObservable().mapJSON().mapObject(type: AlbumDatas.self).subscribe(onNext: {
[weak self] result in
guard let strongSelf = self else {return}
// TODO success
}, onError: {
error in
print(\(error))
}).disposed(by: disposeBag)
}
答案 0 :(得分:0)
从根本上讲,这是在允许URLSessionTask
运行之前创建和恢复它们的问题。 Alamofire加剧了这一点,后者在创建相应的URLSessionTask
值后立即创建*Request
。增加用于图像下载的URLRequest
的超时可能会有所帮助。一个更彻底的解决方案是立即停止创建Alamofire请求,而仅在前几个请求完成后才创建它们。这样可以防止相关任务超时。