【问题标题】:Sequential upload / serial queue with alamofire使用 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) 在后台运行时启动的上传将是任意的(您不能从后台模式启动非任意任务)。

标签: swift queue alamofire grand-central-dispatch


【解决方案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!)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-11
    • 1970-01-01
    • 2017-03-07
    • 1970-01-01
    • 2012-10-13
    • 2014-06-03
    • 2017-11-23
    • 1970-01-01
    相关资源
    最近更新 更多