Swift:如何让Alamofire逐个获得请求

时间:2016-05-31 06:35:08

标签: arrays swift asynchronous alamofire

我是swift的初学者,我遇到过需要在循环中运行AlamoFire GET请求的情况。但据我所知,Alamofire Get请求是一个异步调用,并在循环中调用它将创建一些线程。

要求是:

  1. 我有一系列网址
  2. 必须遍历循环

  3. 必须通过AlamoFire GET请求调用每个索引上的URL

  4. 通过请求接收到的数据将被添加到数组中     数据

  5. 将最后一个数据保存在数组中后,a     应该调用CollectionView.reload调用

  6. 伪代码如下:

        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}
    }
    

    任何人都可以告诉我应该如何顺序完成它?

3 个答案:

答案 0 :(得分:10)

  • 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。

答案 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)

答案 2 :(得分: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

    }

希望上面的代码可以帮到你。