使用 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 的顺序上传/串行队列的主要内容,如果未能解决你的问题,请参考以下文章

Alamofire 串行请求

使用 Parse 时 GCD 串行队列似乎没有串行执行

在 iOS 中使用 NSURLConnection 以串行顺序下载文件

Swift - 调度队列和 U/I 串行运行

iOS面试残篇-辟邪剑谱

Node.js-串行化流程控制