2017-06-16 2 views
0

ブロックが完了したらアクティビティインジケータを削除します。だから私はこのようなことをしました。完了ハンドラ内でUIActivityIndi​​catorをすばやく削除する3

func workflowSelected() 
{ 
    self.btnWorkflow.setTitle(dm.workflowName, for: .normal) 


    self.actIndApprover=UIActivityIndicatorView.init(frame: CGRect.init(x: self.btnFirstApprover.frame.size.width-40, y: 5, width: 30, height: 30)) 
    self.actIndApprover.color=self.com.getfontColor() 
    self.actIndApprover.startAnimating() 
    self.btnFirstApprover.addSubview(self.actIndApprover) 

    self.callingFirstApprovers() { (staus) in 



     self.actIndApprover.stopAnimating() 
     self.actIndApprover.removeFromSuperview() 
     self.actIndApplyLeave.stopAnimating() 
     self.actIndApplyLeave.removeFromSuperview() 
     self.btnFirstApprover.addTarget(self, action: #selector(self.approverClicked), for: .touchUpInside) 

     if(staus) 
     { 
      print("Approvers loaded") 


      NotificationCenter.default.post(name: NSNotification.Name(rawValue: "approverSelected"), object: nil) 



     } 

     else 
     { 

      self.btnFirstApprover.setTitle(self.lan.getConvertedLanguageString(word: "First Approver"), for: .normal) 
     } 
    } 
} 

しかし、このアクティビティインジケータは削除されません。メインスレッドで削除する必要がありますか?もしそうなら、どうすればいいのですか?私を助けてください。 おかげ

UPDATE

func callingFirstApprovers(callback:@escaping(Bool)->Void) 
{ 
    let strBindedParam="workflowId=\(dm.workflowID!)&requesterCode=\(dm.strEmpCode!)&levelId=1" 
    let appendString=com.getServicePath(funcNAme: "workflow") 
    restAPI.prepareUrl(baseUrl:dm.tenantUrl,appendString: appendString, bindedParams: strBindedParam, isAuthorized: true, method: .get, jsonBody: [:]) { (status) in 

     if(status=="success") 
     { 
      self.com.removeProgress() 
      print(self.dm.responseArray) 
      self.arrayApproversFullArray=self.dm.responseArray 


      if(self.dm.responseArray.count>0 && self.dm.responseArray != nil) 
      { 
       let obj=self.dm.responseArray[0] as! [String:Any] 
       print("object approver------\(obj)") 

       if let objApprover:Array<Any> = obj["Approvers"] as? Array<Any> 
       { 
        if(objApprover.count>0) 
        { 
         self.dm.arrayFirstApprovers=objApprover 
         let approverInnerObj=objApprover[0] as! [String:Any] 
         print(objApprover) 

         if let strApproverCode=approverInnerObj["EmployeeCode"] as? Int 
         { 
          self.dm.strApproverCode=String(strApproverCode) 

         } 

         if let strApproverNAme=approverInnerObj["Name"] as? String 
         { 
          self.btnFirstApprover.setTitle(strApproverNAme, for: .normal) 
          self.dm.strApproverNAme=strApproverNAme 
         } 

         print("Approvers are more than 1") 

         callback(true) 
        } 

        else 
        { 
         callback(false) 
        } 
       } 



       callback(false) 

      } 

      else{ 
       callback(false) 
      } 




     } 
     else 
     { 


      print(self.dm.errorMessage) 
      self.com.showAlertMessage() 
      callback(false) 
     } 
    } 

} 

答えて

0

はそうそう、GUIの変更は、メインスレッド上で作成する必要があります。

DispatchQueue.main.async { 
     self.actIndApprover.stopAnimating() 
    } 

通常、Xcodeはコンソール出力に警告を表示します。

+0

私はこれを好きでした。その理由は何ですか? – user1960169

+0

このディスパッチブロックは複数回実行されています – user1960169

+0

あなたのコードや呼び出しがわかりません。それはディスパッチそのものではなく、あなたの実装は複数回呼び出されました – Matz

関連する問題