How do you get the array?



  • colleagues! I'm a start-up developer, so I'm asking you to understand my, perhaps, banal question. Please also refer to the format of the question - I am writing the basic issue in my life and in general. Look what I have: 1. Existing Product class:

    import Foundation
    import UIKit
    

    protocol arrayProductsProtocol {
    init? (productDict: [String: Any])
    }

    struct Product {
    init(store: String?,
    productPostArticle: String?,
    productPostTitle: String?,
    productPostDescription: String?,
    productPostImageCount: Int?,
    productPostPrice: Double?,
    productPostDiscont: Double?,
    productPostFinalPrice: Double?,
    productPostSex: String?,
    productPostSeason: String?,
    productPostPublicationDate: Date,
    productPostLikesCount: Int?,
    productPostIsLiked: Bool?,
    productPostViewsCount: Int?,
    productPostPhotoCount: Int?,
    productPostIsNew: String?,
    productPostArrayPhotos: [URL]?) {
    self.store = store ?? "Название магазина"
    self.productPostArticle = productPostArticle ?? "0000000000"

    self.productPostTitle = productPostTitle ?? "Название продукта"
    self.productPostDescription = productPostDescription ?? "Описание продукта"
    self.productPostImageCount = productPostImageCount ?? 0
    self.productPostPrice = productPostPrice ?? 0
    self.productPostDiscont = productPostDiscont ?? 0
    self.productPostFinalPrice = productPostFinalPrice ?? 0
    self.productPostSex = productPostSex ?? Product.Sex.unisex.rawValue
    self.productPostSeason = productPostSeason ?? Product.Season.autumn.rawValue
    self.productPostPublicationDate = productPostPublicationDate
    self.productPostLikesCount = productPostLikesCount ?? 0
    self.productPostIsLiked = productPostIsLiked ?? false
    self.productPostViewsCount = productPostViewsCount ?? 0
    self.productPostPhotoCount = productPostPhotoCount ?? 0
    self.productPostIsNew = productPostIsNew ?? Product.New.normal.rawValue
    self.productPostArrayPhotos = productPostArrayPhotos ?? []
    

    }

    var productDict: [String: Any] {
    return [
    "productPostArticle" : productPostArticle,

        "productPostTitle" : productPostTitle,
        "productPostDescription" : productPostDescription,
        "productPostPrice" : productPostPrice,
        "productPostDiscont" : productPostDiscont,
        "productPostFinalPrice" : productPostFinalPrice,
        "productPostSex" : productPostSex,
        "productPostSeason" : productPostSeason,
        "productPostPublicationDate" : productPostPublicationDate,
        "productPostLikesCount" : productPostLikesCount,
        "productPostIsLiked" : productPostIsLiked,
        "productPostViewsCount" : productPostViewsCount,
        "productPostIsNew" : productPostIsNew,
        "productPostImageCount" : productPostImageCount,
        "store" : store,
        "productPostPhotoCount" : productPostPhotoCount
    ]
    

    }

    //магазин
    var store: String = ""

    //артукул
    var productPostArticle: String

    //описание товара
    var productPostArrayPhotos: [URL]?

    var productPostTitle: String
    var productPostDescription: String
    var productPostImageCount: Int

    //стоимость товара
    var productPostPrice: Double
    var productPostDiscont: Double
    var productPostFinalPrice: Double

    //параметры товара
    var productPostSex: String
    var productPostSeason: String

    //параметры поста
    var productPostPublicationDate: Date
    var productPostLikesCount: Int
    var productPostIsLiked: Bool
    var productPostViewsCount: Int
    var productPostPhotoCount: Int

    //новизна товара
    var productPostIsNew: String

    //параментры товара
    enum Sex: String {
    case man = "Для мужчин"
    case woman = "Для женщин"
    case unisex = "Унисекс"
    }

    enum Season: String{
    case winter = "Зима"
    case spring = "Весна"
    case summer = "Лето"
    case autumn = "Осень"
    }

    enum New: String {
    case isNew = "Новинка"
    case normal = ""
    case sale = "Скидки"
    }

    extension Product: arrayProductsProtocol {
    init? (productDict: [String : Any]) {
    guard let productPostArticle = productDict["productPostArticle"] as? String,

          let productPostTitle = productDict["productPostTitle"] as? String,
          let productPostDescription = productDict["productPostDescription"] as? String,
          let productPostPrice = productDict["productPostPrice"] as? Double,
          let productPostDiscont = productDict["productPostDiscont"] as? Double,
          let productPostFinalPrice = productDict["productPostFinalPrice"] as? Double,
          let productPostSex = productDict["productPostSex"] as? String,
          let productPostSeason = productDict["productPostSeason"] as? String,
          let productPostPublicationDate = productDict["productPostPublicationDate"] as? Date,
          let productPostLikesCount = productDict["productPostLikesCount"] as? Int,
          let productPostIsLiked = productDict["productPostIsLiked"] as? Bool,
          let productPostViewsCount = productDict["productPostViewsCount"] as? Int,
          let store = productDict["store"] as? String,
          let productPostIsNew = productDict["productPostIsNew"] as? String,
          let productPostImageCount = productDict["productPostImageCount"] as? Int,
          let productPostPhotoCount = productDict["productPostPhotoCount"] as? Int,
          let productPostArrayPhotos = productDict["productPostArrayPhotos"] as? [URL]
    else { return nil }
    
    self.init(
        store: store,
        productPostArticle: productPostArticle,
    
        productPostTitle: productPostTitle,
        productPostDescription: productPostDescription,
        productPostImageCount: productPostImageCount,
        productPostPrice: productPostPrice,
        productPostDiscont: productPostDiscont,
        productPostFinalPrice: productPostFinalPrice,
        productPostSex: productPostSex,
        productPostSeason: productPostSeason,
        productPostPublicationDate: productPostPublicationDate,
        productPostLikesCount: productPostLikesCount,
        productPostIsLiked: productPostIsLiked,
        productPostViewsCount: productPostViewsCount,
        productPostPhotoCount: productPostPhotoCount,
        productPostIsNew: productPostIsNew,
        productPostArrayPhotos: productPostArrayPhotos
    )
    

    }
    }

    I'm trying to create the Products.

    Next, I have a file with functions for Firebase. There he is.

    import Foundation
    import Firebase

    struct FBDataBase {

    static func creatDB(completion: @escaping (([Product]) -> ())) {
    // переходим к списку продуктов (1, 2, 3, 4, 5, ...)

    var array: [Product] = []
    let ref = Firestore.firestore().collection("stores").document((Auth.auth().currentUser?.email)!).collection("products")
    ref.addSnapshotListener { (products, error) in
        array = (products?.documents.compactMap({Product(productDict: $0.data())}))!
    }
    completion(array)
    

    }
    }

    Then I challenge it from ViewController'a as follows:

    override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    // #warning Incomplete implementation, return the number of items
    FBDataBase.creatDB(completion: { (array) in
    self.prodArray = array
    print("self.prodArray: (self.prodArray)")
    print("array: (array)")
    })
    print("prodArray count: (self.prodArray.count)")
    return self.prodArray.count
    }

    Problem is, I have a struct FBDataBase array always zero. I've been trying different methods for a week, but nothing's happened. Please help, colleagues. Thank you very much for your help, because knowledge is lacking, and the dream is its project is standing there and motivation is falling. Thank you.

    P.S.: I beg your pardon for formatting the post, but I don't know how to do it correctly. I think I'm putting in the code through the relevant button and the coming block, but the post looks like all the violin.

    Here's my database photo:
    https://i.stack.imgur.com/U6gxE.png https://i.stack.imgur.com/BhExL.png



  • Try to deal with the asynchronous collbacks, you've got the data all over the place later than you use them.

        ref.addSnapshotListener { (products, error) in
            array = (products?.documents.compactMap({Product(productDict: $0.data())}))!
            completion(array)
        }
    

    Similarly, you have to do when you're downloading the data in the vue counteraller - first download the data, and then you're gonna have to take the wigs out.

        FBDataBase.creatDB(completion: { (array) in
                             self.prodArray = array
                             print("self.prodArray: \(self.prodArray)")
                             print("array: \(array)")
                             self.collectionView.reloadData()
        })
    

    UICollectionView, with the data prepared, will be called to reloadData.

    override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        self.prodArray.count
    }
    


Suggested Topics

  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2