2017-08-17 87 views
0

我正在進行兩個異步網絡調用,並希望使用調度組等待直到調用完成,然後繼續。我的程序很凍結。DispatchGroup.wait()凍結程序

class CommentRatingViewController: UIViewController, UITextViewDelegate { 
let myDispatchGroup = DispatchGroup() 

@IBAction func saveRatingComment(_ sender: Any) { 
     rating = ratingView.rating 
     if rating != 0.0 { 
      myDispatchGroup.enter() 
      saveRating(articleID: post.articleID, userID: post.userID) //Network call 
      self.updatedRating = true 
     } 
     if commentsTextView.text != "" { 
      myDispatchGroup.enter() 
      saveComment(articleID: post.articleID, userID: post.userID, comment: commentsTextView.text!) //Network call    self.addedComment = true 
     } 
     myDispatchGroup.wait() 
     DispatchQueue.main.async { 
      self.delegate?.didCommentOrRatePost(updatedRating: self.updatedRating, addedComment: self.addedComment) 
     } 
    } 

這裏是網絡電話的一個:

func saveRating (articleID: String, userID: String) { 

      let userPostURLRaw = "http://www.smarttapp.com/DesktopModules/DnnSharp/DnnApiEndpoint/Api.ashx?method=UpdatePostRating" 
      Alamofire.request(
       userPostURLRaw, 
       method: .post, 
       parameters: ["articleID": articleID, 
          "newRating": self.rating, 
          "UserID": userID] 
      ) 
       .responseString { response in 
        guard let myString = response.result.value else { return } 

       DispatchQueue.main.async { 
        self.myDispatchGroup.leave() 
       } 
      } 
    } 

網絡電話的工作,直到我介紹了調度組代碼。

+1

爲什麼在調度組中的所有任務完成時,您使用'wait()'而不是向'notify()'添加塊? – Abizern

+0

我只是將其更改爲notify()。更好的方法。謝謝!! –

回答

0

我解決了這個問題。

問題是myDispatchGroup.enter()self.myDispatchGroup.leave()在哪裏被調用在不同的線程。我將呼叫轉移到網絡請求的開始和結束處,現在它工作正常。