有没有办法在Alamofire api请求的响应等待期间显示活动指示器或进度条?使用Swift

时间:2016-12-08 12:45:01

标签: ios swift rest api alamofire

现在我显示硬编码的进度条,填写2秒(平均响应时间)。但我希望它是聪明的。

我的请求看起来像这样。

func makeRequest(to endPoint: String) {
    Alamofire.request(endPoint).responseJSON{ response in
        if let value = response.result.value {
            let responseInJSON = JSON(value)
            self._responseInJSON = responseInJSON
        }
    }
}

期待您的帮助。 感谢。

4 个答案:

答案 0 :(得分:1)

我希望它能帮助我指出评论。

func makeRequest(to endPoint: String) {

    // here you can showActivetyIndicator start progressing here
    Alamofire.request(endPoint).responseJSON{ response in
        if let value = response.result.value {
            let responseInJSON = JSON(value)
            self._responseInJSON = responseInJSON
        }
       // here you can hide Your ActivetyIndicator here
    }
}

只需在Alamofire请求开始之前启动进度,然后在获得API响应后停止。不需要像2秒这样的静态时间。

答案 1 :(得分:1)

您可以尝试一下。

这是在扩展中执行此操作的一种方法,可将其添加到您的所有UIViewControllers中……

extension UIViewController {
    class func displaySpinner(onView : UIView) -> UIView {
        let spinnerView = UIView.init(frame: onView.bounds)
        spinnerView.backgroundColor = UIColor.init(red: 0.5, green: 0.5, blue: 0.5, alpha: 0.5)
        let ai = UIActivityIndicatorView.init(activityIndicatorStyle: .whiteLarge)
        ai.startAnimating()
        ai.center = spinnerView.center

        DispatchQueue.main.async {
            spinnerView.addSubview(ai)
            onView.addSubview(spinnerView)
        }

        return spinnerView
    }

    class func removeSpinner(spinner :UIView) {
        DispatchQueue.main.async {
            spinner.removeFromSuperview()
        }
    }
}

要创建和显示微调器,请在视图控制器中执行以下操作:

let sv = UIViewController.displaySpinner(onView: self.view)

要删除

UIViewController.removeSpinner(spinner: sv)

参考:http://brainwashinc.com/2017/07/21/loading-activity-indicator-ios-swift/

答案 2 :(得分:0)

对于简单的GET请求,遗憾的是由于HTTP协议的限制而不是iOS,这是不可能的。这种事情唯一可能的时候是通过比特流下载类似视频的内容,然后只有当服务器首先告诉客户端文件总大小时才会这样。

有趣的是,Apple自己的消息和Safari应用程序中的进度条完全是假的。如果你仔细观察它们,你会发现杆以固定的速度前进到大约85%,它将停止直到请求结束,此时它将跳到最后。这是由于上述HTTP协议的限制,并不是Apple可以做任何事情。

可以显示UIActivityIndi​​cator以向用户显示正在进行网络通话,您可以在用户界面中创建自己的网络,或者只是在通话结束时拨打UIApplication.shared.networkActivityIndicatorVisible = true并随后返回false

不幸的是,你不是希望的答案,而是真相。 :(

答案 3 :(得分:0)

你可以试试这个:

 spin.center = self.view.center
 spin.activityIndicatorViewStyle = .WhiteLarge
 self.view.addSubview(spin)
 spin.startAnimating()
 let url =  NSURL(string:StoreApi)

 let request = NSMutableURLRequest(URL: url!)

 request.HTTPMethod = "GET"
        Alamofire.request(request)
            .responseJSON { response in
                // do whatever you want here
                switch (response.result) {
                case .Success(let JSON):
                //do what you want after success
                case .Failure:

                }//switch close
                //Spin is my activity indicator
                 self.spin.stopAnimating()
                 self.spin.removeFromSuperview()
            }//responseJSON close