首页 > 解决方案 > 如何在 switch 语句之外访问变异的 var?

问题描述

我有一个 switch 语句,可以获取用户有多少帖子,我将 var 命名numberOfPosts为 = posts.count。但我想从 int 返回 Int 值,numberOfPostsUICollectionView 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 
    }

标签: swift

解决方案


调用该collectionView(_:,numberOfItemsInSection:)函数时,该numberOfPosts变量将为 0,并且在该函数返回时保持不变。这是因为您实际上并未更改numberOfPosts此函数中的变量,而是触发了另一个稍后将更改此变量的函数。话虽如此,您将无法从内部触发查询函数并在同一函数中collectionView(_:,numberOfItemsInSection:)使用其结果(即更改变量)。numberOfPosts

此外,collectionView(_:,numberOfItemsInSection:)通常(意味着总是)开始进行 API 调用的不好地方。它们应该在类似viewDidLoador的函数中执行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()将保持完全相同。


推荐阅读