使用 alamofire 的顺序上传/串行队列
Posted
技术标签:
【中文标题】使用 alamofire 的顺序上传/串行队列【英文标题】:Sequential upload / serial queue with alamofire 【发布时间】:2019-12-02 20:56:43 【问题描述】:我正在使用Alamofire
和序列号DispatchQueue
尝试从一组图像中一次上传一张图像。我想一次上传一个,这样我可以在每次上传时更新一个进度 HUD。我的代码如下所示:
let serialQueue = DispatchQueue(label: "project.serialQueue")
for image in images
serialQueue.async
uploadImage(image: image, progress: progress in
//update progress HUD
, completion: json, error in
//dismiss HUD
)
问题是我的uploadImage()
调用都是同时执行的。我认为这是因为Alamofire
请求是异步运行的。关于如何最好地解决这个问题的任何想法?
【问题讨论】:
同serialQueue.sync
?
@Sh_Khan 是的,.sync 是相同的结果,所有上传一次运行
仅供参考,按顺序上传它们会付出巨大的性能损失。只需实现 HUD 来处理同时上传(例如,Progress
对象的层次结构对我来说似乎是合乎逻辑的解决方案)。但是不要为了HUD而牺牲性能。 (而且,顺便说一句,如果您按顺序启动后台会话,您将无法使用它们。)
性能损失不是由于前台/后台,而是由于网络延迟,顺序上传会放大。测试一下。在我的快速测试中,上传 100 张图片,平均每张大约 200kb,按顺序上传它们的速度大约是同时上传的两倍。您的里程可能会有所不同,但我怀疑您会看到按顺序而不是同时进行的材料性能差异。
关于后台会话,您要确保在用户离开应用程序之前提交所有上传请求。 (如果用户在一个应用程序上传过程中离开应用程序,那么应用程序将不会运行以响应完成并为下一次上传启动即时请求。)如果您有后台会话启动您的上一次上传完成时的应用程序,然后(a)这是开销; (b) 在后台运行时启动的上传将是任意的(您不能从后台模式启动非任意任务)。
【参考方案1】:
Alamofire 在他自己的后台队列中运行,所以你可以试试
var counter = 0
func uploadImg(_ img:UIImage)
uploadImage(image: img, progress: progress in
//update progress HUD
, completion: json, error in
//dismiss HUD
self.counter += 1
if self.counter < images.count
self.uploadImg(images[counter])
)
打电话
uploadimg(images.first!)
【讨论】:
以上是关于使用 alamofire 的顺序上传/串行队列的主要内容,如果未能解决你的问题,请参考以下文章