正在加载 activity 指示器以在异步请求期间显示

Loading activity indicator for display during async request

我一直在尝试实现在请求期间在子视图中显示 activity 指示器的代码。它旨在用于加载,但是如果我转到另一个 segue 然后 return 返回指示器现在就在那里,它永远不会显示。这让我相信超级视图不会重新加载,直到我的函数 运行 到那时子视图不需要显示

示例:

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)

您需要进入主线程才能显示和启动activity指标,然后进入off 主线程做你的异步activity.

如 matt 所述,您需要将 activity 指标添加到主线程上的视图(或与此相关的任何 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)
}

最终以下代码有效并允许 show/hide

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0)) { () -> Void in

            dispatch_async(dispatch_get_main_queue(), { () -> Void in
                //Display my activity indicator
            })

            //Create XML Request, Parse Response

            dispatch_async(dispatch_get_main_queue(), { () -> Void in
                //Hide activity indicator
                //Perform Segue
            })


        }

在Swift5测试过,可以使用下面的简单扩展:

// 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() 删除加载指示器: