正在加载 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()
删除加载指示器:
我一直在尝试实现在请求期间在子视图中显示 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()
删除加载指示器: