2016-05-31 53 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

相关问题