在 swift 3 中删除完成处理程序中的 UIActivityIndi​​cator

Posted

技术标签:

【中文标题】在 swift 3 中删除完成处理程序中的 UIActivityIndi​​cator【英文标题】:Removing UIActivityIndicator inside a completion handler in swift 3 【发布时间】:2017-06-16 07:21:26 【问题描述】:

我想在完成我的块后删除我的活动指示器。所以我做了这样的事情。

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)
        
    

但是这个活动指示器永远不会删除。我需要在主线程上删除它吗?如果是这样,我该怎么做。请帮我。 谢谢

更新

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)
        
    


【问题讨论】:

【参考方案1】:

是的,必须在主线程上进行 GUI 更改。

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

通常 Xcode 会在控制台输出中给出警告。

【讨论】:

我确实喜欢这个,似乎它多次调用。有什么理由吗? 这个调度块运行了多次 我不知道您的代码或电话。这不是 Dispatch 本身,而是你的实现被多次调用 我刚才想了想,当初始时,活动指示器正确消失了,但是当我单击相同的 btn 时,下次它不会出现 你添加了一些断点?然后你可以看到谁在调用你的完成

以上是关于在 swift 3 中删除完成处理程序中的 UIActivityIndi​​cator的主要内容,如果未能解决你的问题,请参考以下文章

swift 3 和 Xcode 8 中的完成处理程序错误

For/In 循环中的完成处理程序 - swift

Swift 中的完成处理程序错误

Swift 3,未调用 URLSession 数据任务完成处理程序

完成处理程序中的 Swift 泛型

使用 Google Drive REST API 在 Swift 3 完成处理程序中避免向下转换