我需要在后端工作期间实施纺车。我在一个单独的课上有我的后端工作。
class ViewControllerA: UITableViewController {
// Code
var GetBackendRecordObj = GetBackendRecord(initparam:param);
// CODE TO START ANIMATION (SPINNING WHEEL)
self.view.addSubview(self.activityIndicator)
self.activityIndicator.bringSubview(toFront: self.view)
self.activityIndicator.startAnimating()
// CODE TO CALL THE BACKEND IS IN ANOTHER CLASS
GetBackendRecordObj.fetch_record()
}
class GetBackendRecord{
var transaction_id: String = ""
var current_email_id: String = ""
init(initparam: String) {
self.initparam = initparam
}
func fetch_record (){
do{
DispatchQueue.global(qos: .userInitiated).async {
//code
DispatchQueue.main.async { () -> Void in
//code to process response from backend
// NEED CODE TO STOP ANIMATION (SPINNING WHEEL)THAT WAS STARTED IN VIEWCONTROLLERA
})
}
}
}
如何在后端调用完成后访问UITableViewcontroller,这样我就可以停止动画了。或者如果在执行后端作业时有更好的方法来启动/停止动画(在单独的课程中),请告诉我。
答案 0 :(得分:3)
向fetch_record
添加完成处理程序:
func fetch_record(_ completionHandler: @escaping () -> Swift.Void) {
do{
DispatchQueue.global(qos: .userInitiated).async {
//code
DispatchQueue.main.async { () -> Void in
//code to process response from backend
completionHandler()
})
}
}
}
在ViewController
中调用它时,您可以指定完成后要执行的操作:
GetBackendRecordObj.fetch_record() {
self.activityIndicator.stopAnimating()
}
答案 1 :(得分:1)
如果您需要知道响应何时返回以便您可以停止加载器,则需要向进行Internet调用的方法添加完成处理程序。在大多数进行互联网调用的方法中,通常应该有完成处理程序,特别是如果只有在得到响应后才需要UI事件发生。
对于fetchRecord
函数:
我已为此调用添加了完成处理程序。优选地,您可以在@escaping
之后(例如字典或数组,如果它是JSON响应)处理某些内容,然后在另一种方法中处理该响应。但是,如果您希望代码使用您在此处设置的线程处理此方法中的响应,那么我已经相应地编写了它。
func fetch_record(withCompletion comp: @escaping () ->()){
do{
DispatchQueue.global(qos: .userInitiated).async {
//code
DispatchQueue.main.async { () -> Void in
//code to process response from backend
//this tells whatever called this method that it is done
comp()
})
}
}
}
然后在您的视图控制器中调用GetBackendRecordObj.fetch_record()
GetBackendRecordObj.fetch_record(withCompletion: { [weak self] () in
//when it hits this point, the process is done
self?.activityIndicator.stopAnimating()
}
答案 2 :(得分:0)
而不是activityIndicator更好地使用MBProgressHUD。
https://github.com/jdg/MBProgressHUD
显示MBProgressHUD
let loadingNotification = MBProgressHUD.showHUDAddedTo(self.view, animated: true)
loadingNotification.mode = MBProgressHUDMode.Indeterminate
loadingNotification.labelText = "Loading"
隐藏MBProgressHUD
DispatchQueue.main.async { () -> Void in
MBProgressHUD.hideAllHUDsForView(self.view, animated: true)
})
您可以在启动后端作业的单独类中实现show MBProgressHUD,并在后端处理完成后隐藏代码。