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 Firebasestruct 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 }