我是swift的初学者,我遇到过需要在循环中运行AlamoFire GET请求的情况。但据我所知,Alamofire Get请求是一个异步调用,并在循环中调用它将创建一些线程。
要求是:
必须遍历循环
必须通过AlamoFire GET请求调用每个索引上的URL
通过请求接收到的数据将被添加到数组中 数据
将最后一个数据保存在数组中后,a 应该调用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}
}
任何人都可以告诉我应该如何顺序完成它?
答案 0 :(得分:10)
bookmarks
数组作为类属性。index
数组Int
以存储索引值(bookmarks
)
以下是代码:
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
}
希望上面的代码可以帮到你。