具有进度条的简单URLSession uploadTask

时间:2018-08-07 19:56:02

标签: ios swift networking

我对URLSession和uploadTask完全感到困惑。实际上,我只想将json上传到Web服务器,并且在上传过程中,应该显示一个简单的进度栏。 我实现了苹果公司提供的方法:https://developer.apple.com/documentation/foundation/url_loading_system/uploading_data_to_a_website

上传正在工作,我得到了回应。.到目前为止,一切都很好,但是我不知道如何在上传过程中显示进度条。我试过的是在调用包含上传任务的方法之前显示进度条

startActivityIndicator()

    let jsonPackage = JSONIncident(incident: incident)

    jsonPackage.sendToBackend(completion: {
        message, error in
  //Handle the server response




    })

    self.activityIndicator.stopAnimating()
    UIApplication.shared.endIgnoringInteractionEvents()

我意识到这很愚蠢,因为上传任务在另一个线程中是异步的。

我想我必须使用代理人,但我不知道以哪种方式。例如,如果我实现URLSessionTaskDelegate,则必须实现一堆函数,例如isProxy(),isKind(),isMember等。

能否请您提供一个简单的示例,说明如何在上载任务运行期间显示进度栏? 那太好了! 非常感谢你 问候克里斯

2 个答案:

答案 0 :(得分:1)

您需要遵守URLSessionTaskDelegate协议并调用此委托方法:

func urlSession(_ session: URLSession, task: URLSessionTask, didSendBodyData bytesSent: Int64, totalBytesSent: Int64, totalBytesExpectedToSend: Int64)
{
    var uploadProgress:Float = Float(totalBytesSent) / Float(totalBytesExpectedToSend)
}

然后在进度条中使用uploadProgress变量。

像这样创建会话:

var session = URLSession(configuration: URLSessionConfiguration.default, delegate: self, delegateQueue: OperationQueue.main)

答案 1 :(得分:0)

您可以使用带有swiftyJSON(JSON解析)库的alamofire(用于api调用)来上传JSON。您只需要在调用alamofire api之前调用加载程序,并在获得响应时停止加载程序即可。