首先请原谅任何错误的术语,就在几周前,我开始学习转义的闭包。
我有一个API,在转义的闭包中“返回”数组。该函数的调用方式如下:
getAllUserMovies(username: user) { (result) in
switch result {
case .success(let movies):
// movies is an array. Do something with each element
break
case .error(let error):
// report error
break
}
}
在这种集合视图方法中,我只需要使用该数组的元素,每次仅使用一个(实际上比这更复杂,因为我也与TMDB API交互):
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell
我尝试以类似的方式使用嵌套的闭包:
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell : collectionViewCell = collectionView.dequeueReusableCell(withReuseIdentifier: self.reuseIdentifierLargeBanners, for: indexPath as IndexPath) as! CollectionViewCell
getAllUserMovies(username: user){ (result) in
switch result {
case .success(let movies):
let movie = movies[indexPath.row] {
cell.imageView.image = movie.poster
}
break
case .error(let error):
print(error?.localizedDescription ?? "")
break
}
}
return cell
}
return UICollectionViewCell()
}
基本上我有两个问题。首先,我认为这是完全无效的(刷新单元格时,我必须随时获取完整的电影列表),然后我还会得到有趣的结果,例如重复的横幅,这些横幅会不断刷新,移动或丢失图标。我实现了此question的可接受的答案,但仍然无法使其正常工作。无论我做什么,我要么得到重复的图像,要么得到空白的单元格,要么两者都有。
更新:似乎缺少的图标是由于API中每秒调用次数的限制所致。超过该数字,API将失败,我没有检查错误。
我想可能的解决方案是将“电影”数组存储在某个地方,然后能够从集合视图方法中从中获取单个电影。如有需要,请刷新。由于anuraj的回答,现在已经解决了!
答案 0 :(得分:1)
如果每次滚动时都在cellForItemAt
中实现API调用,则会导致API调用。
我建议您在didLoad
或willAppear
中进行API调用,并在全局保存结果后刷新集合视图。
func makeAPICall() {
getAllUserMovies(username: user){ (result) in
switch result {
case .success(let movies):
self.movies = movies
yourCollectionView.reloadData()
break
case .error(let error):
print(error?.localizedDescription ?? "")
break
}
}
}
集合视图数据源
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return self.movies.count
}