加载活动指示器以在异步请求期间显示

时间:2016-03-26 16:49:43

标签: ios swift uiactivityindicatorview

我一直在尝试实现在请求期间在子视图中显示活动指示符的代码。它意味着用于加载,但是如果我去另一个segue然后返回指标现在就在那里它永远不会显示。这让我相信superview不会重新加载,直到我的函数运行,到那时子视图不需要显示

示例:

loadingIndicator.startIndicator(self.view)

        let parameters = Parameters()

        parameters.addParams(search: search)
        let request = SearchRQ(parameters: parameters)

        request.getResponse()

        while !request.isComplete
        {
            //Wait
        }

        let results = request.parseResponse()
        self.results = results

        loadingIndicator.stopIndicator(self.view)

        performSegueWithIdentifier("showSearchResults", sender: sender)

4 个答案:

答案 0 :(得分:1)

如亚特所述,您需要在主线程上将您的活动指示符添加到视图(或任何UI更改)。

你可以这样做:

dispatch_async(dispatch_get_main_queue(),{
    self.view.addSubview(activityIndicator)
})

要等待主线程的响应,请更改getResponse函数,使其具有完成处理程序。 :

func getResponse(responseReceived:() ->Void) {
    // Once I get my response:
    responseReceived()
}

然后,您可以在收到回复后进行适当的更改。

getResponse {
    let results = request.parseResponse()
    self.results = results

    loadingIndicator.stopIndicator(self.view)

    performSegueWithIdentifier("showSearchResults", sender: sender)
}

答案 1 :(得分:0)

您需要进入主线程以显示和启动活动指示符,然后执行 off 主线程以执行异步活动。

答案 2 :(得分:0)

最后,以下代码工作并允许显示/隐藏

Lucene

答案 3 :(得分:0)

在Swift 5中进行了测试,您可以使用以下简单扩展名:

// Activity Indicator Extension
var vSpinner : [UIView] = []

extension UIViewController {
    func showSpinner(onView : UIView) {
        let spinnerView = UIView.init(frame: onView.bounds)
//        spinnerView.backgroundColor = UIColor.init(red: 0.8, green: 0.8, blue: 0.8, alpha: 0.9)
        let ai = UIActivityIndicatorView.init(style: .medium)
        ai.startAnimating()
        ai.center = spinnerView.center
        
        DispatchQueue.main.async {
            spinnerView.addSubview(ai)
            onView.addSubview(spinnerView)
        }
        
        vSpinner.append(spinnerView)
    }
    
    func removeSpinner() {
        DispatchQueue.main.async {
            vSpinner.popLast()?.removeFromSuperview()
        }
    }
}

在您的异步任务中,请使用以下两个方便的男孩:

showSpinner(onView: self.view)记住要用任何所需的视图替换 self.view

self.removeSpinner()卸下加载指示器: