如何在后端工作中实施纺车?

时间:2016-12-01 15:28:15

标签: ios swift grand-central-dispatch

我需要在后端工作期间实施纺车。我在一个单独的课上有我的后端工作。

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,这样我就可以停止动画了。或者如果在执行后端作业时有更好的方法来启动/停止动画(在单独的课程中),请告诉我。

3 个答案:

答案 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)

而不是activityIndi​​cator更好地使用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,并在后端处理完成后隐藏代码。