2017-06-09 107 views
0

我知道如何通過完成進行同步請求。但我不知道如何在一個循環中進行同步請求。帶回路的Alamofire同步請求

這裏是我的代碼:

var marks = [JSON]() 
    let vnCount = studentVnCodes.count 

    var i: Int = 0 

    marks = [JSON](repeating: JSON.null, count: vnCount) 

    for vn in studentVnCodes { 
     let url = "https://example.com/Student/Grade/GetFinalGrades?&vn=\(vn)&academic_year=All" 

     Alamofire.request(url).responseString { response in 

      var dataString: String = (response.result.value)! 

      dataString = cleanMarksJSON(string: dataString) 

      if let dict = convertToDictionary(text: dataString) { 

       marks[i] = (JSON(dict as Any)) 

       i += 1 

       if (vnCount == marks.count) { 
        completionHandler(marks) 
       } 
      } 

     } 
    } 

在這裏,我試圖讓與VN碼(vnCount)的數x請求。 問題是我在我的JSON數組中排列錯誤的所有JSON marks。當然是因爲它在完成時將響應追加到數組中,並且不會等待先前的請求結束。

所以我試着創建一個變量i來強制函數以正確的順序附加響應。這不起作用。任何想法?謝謝!

回答

0

您可以在串行隊列中順序運行您的請求,在這種情況下,它們將按您調用它們的順序執行,這將確保它們將按順序添加到數組中。然而,這似乎是一個不太理想的解決方案,因爲通過按順序運行請求而不是併發運行來損失執行時間。

如果你仍然想實現像這樣,看下面的代碼:

var marks = [JSON]() 
let vnCount = studentVnCodes.count 
marks = [JSON](repeating: JSON.null, count: vnCount) 
let serialQueue = DispatchQueue(label: "serialQueue") 
for vn in studentVnCodes { 
    serialQueue.async{ 
     let url = "https://example.com/Student/Grade/GetFinalGrades?&vn=\(vn)&academic_year=All" 
     Alamofire.request(url).responseString { response in 
      var dataString: String = (response.result.value)! 
      dataString = cleanMarksJSON(string: dataString) 
      if let dict = convertToDictionary(text: dataString) { 
       marks.append(JSON(dict as Any)) 
       if (vnCount == marks.count) { 
        completionHandler(marks) 
       } 
      } 
     } 
    } 
} 

一個更好的解決辦法是將存儲在數據結構,其中順序沒關係的反應,例如在一個字典,其中您的鍵是索引(您將用於數組),而您的值是JSON響應值。這樣,您可以同時運行這些請求並按順序訪問這些響應。

+0

謝謝!然而你是對的:這不是最佳的。所以我找到了你給我字典的另一種方式。我們有同樣的想法! ;) –