swift - 如何在 switch 语句之外访问变异的 var?
问题描述
我有一个 switch 语句,可以获取用户有多少帖子,我将 var 命名numberOfPosts
为 = posts.count
。但我想从 int 返回 Int 值,numberOfPosts
但UICollectionView func numberOfItemsInSection
它总是返回零。我该如何解决这个问题?
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
userSubID = AWSMobileClient.default().userSub!
let post = uploads.keys
let predicate = post.userSub == userSubID
_ = Amplify.API.query(request: .list(uploads.self, where: predicate)) { event in
switch event {
case .success(let result):
switch result {
case .success(let posts):
self.numberOfPosts = posts.count
print(numberOfPosts) // It prints the num of posts
case .failure(let error):
print("Got failed result with \(error.errorDescription)")
}
case .failure(let error):
print("Got failed event with error \(error)")
}
}
print(numberOfPosts)
return numberOfPosts //The variable returns 0
}
解决方案
调用该collectionView(_:,numberOfItemsInSection:)
函数时,该numberOfPosts
变量将为 0,并且在该函数返回时保持不变。这是因为您实际上并未更改numberOfPosts
此函数中的变量,而是触发了另一个稍后将更改此变量的函数。话虽如此,您将无法从内部触发查询函数并在同一函数中collectionView(_:,numberOfItemsInSection:)
使用其结果(即更改变量)。numberOfPosts
此外,collectionView(_:,numberOfItemsInSection:)
通常(意味着总是)开始进行 API 调用的不好地方。它们应该在类似viewDidLoad
or的函数中执行viewDidAppear
。
你真正想要实现的是最初显示一个空的集合视图,执行 API 调用,当你有结果时,你需要更新集合视图并用获取的数据填充它。
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
userSubID = AWSMobileClient.default().userSub!
let post = uploads.keys
let predicate = post.userSub == userSubID
_ = Amplify.API.query(request: .list(uploads.self, where: predicate)) { event in
switch event {
case .success(let result):
switch result {
case .success(let posts):
self.numberOfPosts = posts.count
print(numberOfPosts) // It prints the num of posts
self.collectionView.reloadData() // Reload the collection view here
case .failure(let error):
print("Got failed result with \(error.errorDescription)")
}
case .failure(let error):
print("Got failed event with error \(error)")
}
}
}
}
extension ViewController: UICollectionViewDataSource {
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return self.numberOfPosts
}
}
此外,您很可能需要使用实际数组来使用数据填充集合视图,因此存储posts.count
可能对您没有太大帮助。相反,您需要存储posts
. 但是,在集合视图函数之外的某个地方进行 API 调用和调用的总体思路collectionView.reloadData()
将保持完全相同。
推荐阅读
- pytorch - Chainer 中的渐变剪裁
- angular - 带有可扩展行的 Angular (7+) 材质表 - 同时有多个扩展行
- php - php中的多个三维复选框数组
- kubernetes - 如何将数据从 GCP pubsub 发送到 prometheus pod
- javascript - 如何创建垂直自动滚动效果?
- php - 当当前页面在新的浏览器选项卡中打开时,如何获取以前的网址?
- laravel - 如何在发出 POST 请求时修复 Class not found 错误?
- amazon-athena - 读取部分数据的符号文件
- xamarin.forms - Xamarin Forms:如何将一个布局放在另一个布局之上
- c# - 读取多条记录