2016-05-31 61 views
4

我是swift的初學者,遇到了需要在循環中運行AlamoFire GET請求的情況。但據我所知,Alamofire Get請求是一個異步調用,並在循環中調用它將創建多個線程。Swift:Alamofire如何在循環中獲得一個接一個的請求

的要求是:

  1. 我有網址
  2. 陣列具有在一個循環

  3. 上的每個索引的URL必須通過AlamoFire稱爲GET請求待運行的陣列

  4. 通過請求接收到的數據將被添加到一個數組 數據

  5. 最後的數據被保存在陣列中後, CollectionView.reload調用應該被稱爲

僞代碼如下:

for bookmarkURL in bookmarks 
     Alamofire.request(.GET, bookmarkURL).responseJSON 
       { response in switch response.result { 
       case .Success(let JSON): 
        x[i] = JSON as! [String : AnyObject] // saving data 

       case .Failure(let error): 
        print("the error for \(self.bookmarkURL) is \(error) ") 
       } 
     i++ 
     if i == bookmarks.count{ 
      collectionView.reload() 
      break} 
} 

誰能告訴我,我應該如何按順序做?

回答

9
  • bookmarks數組作爲類屬性。
  • 類屬性index添加到存儲索引值(Int)在遍歷bookmarks陣列
  • 添加一個函數來作出API調用並遞歸調用它。

下面是代碼:

func getData() { 
    var x = [[String: AnyObject]]() 
    Alamofire.request(.GET, bookmarks[index]).responseJSON { response in 
     switch response.result { 
     case .Success(let JSON): 
      x[self.index] = JSON as! [String : AnyObject] // saving data 
      self.index = self.index + 1 
      if self.index < self.bookmarks.count { 
       self.getData() 
      }else { 
       self.collectionView.reloadData() 
      } 
     case .Failure(let error): 
      print("the error for \(self.bookmarks[self.index]) is \(error) ") 
      if self.index < self.bookmarks.count { 
       self.getData() 
      }else { 
       self.collectionView.reloadData() 
      } 
     } 
    } 

} 

這樣,您的請求將被製成僅在前面完成從而使其順序,而不是平行的,你也只能在最後一個請求後重新裝載的CollectionView完成了。

+0

重複函數的邏輯運行良好 –

2

我想你應該每次收到服務器對收到回覆的迴應時都要重新載入收集視圖的項目。

這裏是解決方案:

let x : NSMutableArray = NSMutableArray.init(capacity: bookmarks.count) 

for var i in 0 ..< x.count { 

    Alamofire.request(.GET, bookmarkURL).responseJSON 
       { response in switch response.result { 
       case .Success(let JSON): 

    x.insertObject(JSON as! [String : AnyObject], atIndex:i) 
       // x[i] = // saving data 
    // <reload relative item cell of collectionView> 

       case .Failure(let error): 
        print("the error for \(self.bookmarkURL) is \(error) ") 
       } 
     i+=1 

    } 

希望上面的代碼將幫助你。

3

如果你想只接收整個數據後重新加載您的收藏視圖,您可以使用dispatch_group一樣,

let group = dispatch_group_create() // create a group. 

    dispatch_group_enter(group) // enter the group just before create the request 

    dispatch_group_leave(group)//leave the group on completion closure 
    dispatch_group_notify(group, group) { 
     //reload your collection view 
    } 

的完整代碼

for bookmarkURL in bookmarks { 
     dispatch_group_enter(group) 
     Alamofire.request(.GET, bookmarkURL).responseJSON { response in 
     switch response.result { 
      case .Success(let JSON): 
       x[i] = JSON as! [String : AnyObject] // saving data 

      case .Failure(let error): 
       print("the error for \(self.bookmarkURL) is \(error) ") 
      } 
     dispatch_group_leave(group) 
     } 
    } 
    dispatch_group_notify(group, group) { 
     collectionView.reload() 
    } 

注意:如果您的書籤數組太大,最好不要循環做。 對於您可以使用下面的代碼

func loadBookmarkAtIndex(index: Int) { 
    if index >= bookmarks.count { 
     collectionView.reload() 
     return 
    } 
    let bookmarkURL = bookmarks[index] 
    Alamofire.request(.GET, bookmarkURL).responseJSON { response in 

     switch response.result { 
     case .Success(let JSON): 
      x[index] = JSON as! [String : AnyObject] // saving data 

     case .Failure(let error): 
      print("the error for \(bookmarkURL) is \(error) ") 

     } 
     self.loadBookmarkAtIndex(index+1) 
    } 
} 

而且從正在啓動的數據檢索調用self.loadBookmarkAtIndex(0)

+0

AlamoFire GET請求是否會通過此方法在循環中逐個調用? –

+0

不,但它會等待完成所有請求,執行通知組。如果您想逐一打電話給alamofire請求,最好使用其他技巧。 – Johnykutty

+0

根據您的實際要求更新了答案 – Johnykutty

相關問題