ios - 如何从我的 NetworkingService 响应访问我的 HomeViewController 中的用户属性?

标签 ios swift xcode data-structures

如何从我的 NetworkingService 响应访问我的 HomeViewController 中的用户属性??

我能够在我的 NetworkingService 中打印所有用户,但我需要在我的 HomeViewController 中的 ViewDidLoad 中访问它们。

到目前为止,这是我在 NetworkingService 中打印属性的代码:

import Foundation

class NetworkingService {

    static let shared = NetworkingService()

    let session = URLSession.shared

    func getUsers(success successBlock: @escaping (GetUsersResponse) -> Void) {

        guard let url = URL(string: "") else
        { return }

        session.dataTask(with: url) { (data, response, error) in

            if let error = error { print(error); return }
            do {
                let decoder = JSONDecoder()
                let dateFormatter = DateFormatter()
                dateFormatter.locale = Locale(identifier: "en_US_POSIX")
                dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
                decoder.dateDecodingStrategy = .formatted(dateFormatter)
                let result = try decoder.decode(Root.self, from: data!)
                for user in result.users {
                    print(user.id ?? "", user.name ?? "", user.userName ?? "", user.createdDate ?? "", user.profileImage ?? "")

                }
            } catch {
                print(error)
            }

            }.resume()
    }
}

上面的代码打印了 NetworkingService 内部的所有用户,但我需要在我的 ViewController 中访问它们,如下所示:

import UIKit

class HomeViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate {

    let usersArray: [String] = []

    override func viewDidLoad() {
        super.viewDidLoad()
        NetworkingService.shared.getUsers { (response) in

        }
    }

    //Number of views
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return usersArray.count
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let userCell = collectionView.dequeueReusableCell(withReuseIdentifier: "UserCollectionViewCell", for: indexPath) as! UserCollectionViewCell
        userCell.backgroundColor = UIColor.green
        return userCell
    }
}

我也有这个用户结构:

import Foundation

struct Root: Decodable {
    let users: [User]
}

    struct User : Decodable {
        let id: Int?
        let name: String?
        let userName: String?
        let profileImage: URL?
        let createdDate: Date?
}

以及当前什么都不做的 GetUserResponse 结构:

import Foundation

struct GetUsersResponse {

}

如何让打印在我的 NetworkingService 中的值显示在我的 HomeViewController ViewDidLoad 的标签中?非常感谢!!

最佳答案

你需要

 var usersArray = [Users]()

NetworkingService.shared.getUsers { (response) in
  self.usersArray = response 
  DipsatchQueue.main.async {
    self.collectionView.reloadData()
  }
}

并改变

func getUsers(success successBlock: @escaping ([Users]) -> Void) {

    guard let url = URL(string: "") else
    { return }

    session.dataTask(with: url) { (data, response, error) in

        if let error = error { print(error); return }
        do {
            let decoder = JSONDecoder()
            let dateFormatter = DateFormatter()
            dateFormatter.locale = Locale(identifier: "en_US_POSIX")
            dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
            decoder.dateDecodingStrategy = .formatted(dateFormatter)
            let result = try decoder.decode(Root.self, from: data!)
            for user in result.users {
                print(user.id ?? "", user.name ?? "", user.userName ?? "", user.createdDate ?? "", user.profileImage ?? "")

            }
            success(result.users ?? [] )
        } catch {
            print(error)
        }

        }.resume()
}

同时更改 cellForItemAt 以显示每个用户可能在集合单元格内附加的 UILabel outlets 中

关于ios - 如何从我的 NetworkingService 响应访问我的 HomeViewController 中的用户属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57136425/

相关文章:

ios - Swift - 2个空字符串数组

android - 适用于 iOS 和 Android 的 AES GCM 加密库

ios - 字符串和属性问题

objective-c - Objective C 为类属性赋值的快捷方式

xcode - 在 App Store 之外分发 Mac 应用程序。我应该怎么签?

ios - 如何在 Swift 中将下一个 ViewController 中 UIlabel 的颜色更改为当前 ViewController 中的选定颜色

ios - 如何仅针对 iOS 9 用户安全地将 `Watch Connectivity` 与仍以 iOS7 作为最低开发目标的应用程序集成?

arrays - 如何通过在 Swift 中增加索引来在数组中插入值?

ios - 如何在 iOS8 上使 UICollectionViewCell 高度动态(带自动布局)

ios - 如何在 iOS 中调试 "second run"?