2017-08-16 35 views
-4

當我發出以下網絡請求時,print語句似乎在異步之前觸發。請求已完成。我試圖只在異步請求完成後調用主線程。如何在異步請求後調用主線程

func getRating (articleID: String) { 
    let endPointURL = "http://www.smarttapp.com/DesktopModules/DnnSharp/DnnApiEndpoint/Api.ashx?method=GetRating" 
    let encodedarticleIDURL = endPointURL.addingPercentEncoding(withAllowedCharacters: CharacterSet.urlQueryAllowed)! 
    let myURL = URL(string: encodedarticleIDURL) 

    Alamofire.request(
     myURL!, 
     parameters: ["articleID": articleID] 
     ) 
     .responseData { response in 
      guard response.result.isSuccess else { 
       return 
      } 

      if let data = response.data, let myDataString = String(data: data, encoding: .utf8) { 
       print("MyDataString is: \(myDataString)") 
       let newRating = Double(myDataString)! 
       self.post.rating = newRating 
       print(newRating) 
      } 
    } 
    DispatchQueue.main.async { 
     print("Final value \(self.post.rating)") 
     self.networkingState = .finishedSearching 
     self.tableView.reloadData() 
    } 
} 

回答

1

你需要做你Alamofire應答結束塊內的主線程,它應該工作

Alamofire.request(
     myURL!, 
     parameters: ["articleID": articleID] 
     ) 
     .responseData { response in 
      guard response.result.isSuccess else { 
       return 
      } 

      if let data = response.data, let myDataString = String(data: data, encoding: .utf8) { 
       print("MyDataString is: \(myDataString)") 
       let newRating = Double(myDataString)! 
       self.post.rating = newRating 
       print(newRating) 
      } 

     DispatchQueue.main.async { 
     print("Final value \(self.post.rating)") 
     self.networkingState = .finishedSearching 
     self.tableView.reloadData() 
    } 
    }