2015-12-01 29 views
-1

我是Swift中的新成員。使用NSURLSession從服務器下載JSON數據後,我無法立即調用該函數。這裏是我的代碼 -Swift 2在CompletionHandler中調用函數

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 
     }) 
    } 
+0

'hideOverLayView'函數是否存在於你的類中?你可以調用'self.hideOverLayView()'? – JAL

+0

是的。在那。 – Shohrab

+0

那麼'self.hideOverLayView()'工作嗎?什麼是你得到的完整錯誤? – JAL

回答

2

當你在關閉的時候,你需要顯式調用類方法self。沒有self,您的方法的上下文不明確。

更改hideOverLayView()self.hideOverLayView()在您的dispatch_async區塊內。

+0

dispatch_async(dispatch_get_main_queue(),{() - > self.dataReceievedFromServer() }) 這就是我稱之爲的方式。順便說一下,我改變了methodName。但似乎仍然錯誤 – Shohrab

+0

@Shhrab:不,這不是你如何調用它。請按照此答案中的指示添加'self.'。 –

+0

太棒了。感謝它的作品。 :) – Shohrab

3

您可以嘗試self?.hideOverLayView()以避免此警告。 你可以做的另一件事是在關閉開始時加入[weak self]以使自己變弱。

相關問題