Swift 2 在 CompletionHandler 中调用函数

Swift 2 Call Function in CompletionHandler

我是 Swift 的新人。使用 NSURLSession 从服务器下载 JSON 数据后,我无法立即调用函数。这是我的代码 -

func loadTableViewWithServerData(_url:String){
        showOverLayView()
        let postEndpoint: String = _url
        let session = NSURLSession.sharedSession()
        let url = NSURL(string: postEndpoint)!
        session.dataTaskWithURL(url, completionHandler: {
            (data, response, error) in

            guard let responseData = data else {
                print("Error: did not receive data")
                return
            }
            let post: NSMutableArray
            do {
                post = try NSJSONSerialization.JSONObjectWithData(responseData,
                    options: []) as! NSMutableArray
                self.dataArray = SHDataAccess().arrayFromPlist(post)

                dispatch_async(dispatch_get_main_queue(), { () -> Void in
                     self.questionTableView.reloadData()

                     //hideOverLayView() /* it shows error here*/

                 })


            } catch  {
                print("error trying to convert data to JSON")
            }

        }).resume()
    }

当我尝试调用 hideOverLayView() /* it shows error here*/ 时,它显示错误:

Error : Call to method 'hideOverLayView()' in closure requires explicit 'self' to make capture semantics explicit.

我该如何解决这个问题?或者调用另一个函数的正确方法是什么,我在服务器数据可用时刷新我的视图。

这是我的 hideOverLayView() /* it shows error here*/ 函数 -

func hideOverLayView(){
        self.overLayView.imageProgress.stopAnimating()
        UIView.animateWithDuration(0.5, animations: {
            self.overLayView.hidden = true
        })
    }

当您处于闭包中时,您需要使用 self 显式调用 class 方法。如果没有 self,您的方法的上下文不明确。

dispatch_async 块内将 hideOverLayView() 更改为 self.hideOverLayView()

您可以尝试 self?.hideOverLayView() 来避免警告。 您可以做的另一件事是在闭包的开头添加 [weak self] 以使 self 变弱。