我将一些文件上传到Firebase Storage
中,这是文件的层次结构:
Inventory/
Inventory/Inventory.json
Inventory/Meat/Meat.json
Inventory/Meat/newMeat.jpg
Inventory/Chicken/Chicken.json
Inventory/Chicken/chicken1.jpg
Inventory/Chicken/chicken2.jpg
Inventory.json
文件包含Firebase Storage
和Meat.json
json文件的Chicken.json
完整路径。
Meat.json
文件包含Firebase Storage
文件的newMeat.jpg
完整路径。
Chicken.json
文件包含Firebase Storage
和chicken1.jpg
图片文件的chicken2.jpg
完整路径。
(我的意图是通过这种方式组织我的数据)
然后,我正在使用以下代码从Firebase Storage
获取数据:
import Foundation
import Firebase
class Firebase
{
static var oneMB : Int64 = 1024 * 1024
static var storage: Storage?
static var storageRef: StorageReference?
static var isUserConnected = false
static func signIn(isAnonymous: Bool, userName: String? = nil, password: String? = nil) -> Bool
{
var isUserAuthenticated = true
if Auth.auth().currentUser != nil {
return true }
if (isAnonymous)
{
Auth.auth().signInAnonymously(completion: { (authResult, error) in
if let _ = error {
isUserAuthenticated = false }
else {
isUserAuthenticated = true }
})
}
else
{
if let user = userName, let pass = password
{
// Sign in with a user.
print(user + pass)
}
}
return isUserAuthenticated
}
static func getData(filePath: String) -> Data?
{
var dataToReturn: Data?
if let storage = self.storage
{
self.storageRef = storage.reference(withPath: filePath)
if let storageRef = self.storageRef
{
storageRef.getData(maxSize: self.oneMB)
{
extractedData, error in
if error == nil, let data = extractedData
{
dataToReturn = data
}
}
}
}
return dataToReturn
}
static func getInventoryData(inventoryPath: String)
{
let isUserSignedIn = signIn(isAnonymous: true)
if (!isUserSignedIn) { return }
self.storage = Storage.storage()
let inventoryData = self.getData(filePath: inventoryPath)
let inventoryJson = JSON(string: Utils.getStringFromData(inputData: inventoryData))
for categoryTag in inventoryJson
{
let categoryData = self.getData(filePath: categoryTag.value.string!)
let categoryJson = JSON(string: Utils.getStringFromData(inputData: categoryData))
let categoryId = categoryJson["id"].string!
let categoryName = categoryJson["name"].string!
var listOfProducts = [Product]()
for productTag in categoryJson["products"]
{
let productData = self.getData(filePath: productTag.value.string!)
let productJson = JSON(string: Utils.getStringFromData(inputData: productData))
let productId = productJson["id"].string!
let productName = productJson["name"].string!
let productPriceForKg = Float(productJson["price for kg"].string!)!
let productImage = productJson["image"].string!
let productImageData = self.getData(filePath: productImage)
if let imageData = productImageData
{
if let image = UIImage(data: imageData as Data)
{
let newProduct = Product(id: productId, Name: productName, image: image, quantity: 0.0, priceForKg: productPriceForKg)
listOfProducts.append(newProduct)
}
}
if var existingCategory = Utils.inventory.first(where: {$0.name == categoryName})
{
existingCategory.listOfProducts = existingCategory.listOfProducts + listOfProducts
continue
}
let newCategory = Category(id: categoryId, name: categoryName, listOfProducts: listOfProducts)
Utils.inventory.append(newCategory)
}
}
Utils.inventory = Utils.inventory.sorted(by: { $0.id < $1.id })
try! Auth.auth().signOut()
}
}
Firebase
已按照Firebase
文档中的说明进行配置,并且看起来可以正常工作。
我的问题与Firebase's getData
函数异步工作这一事实有关,因此,我的数据结构返回空。
我不是第一个想要实现类似目标的人。
我看到了一些有关和观察员的帖子,但这无助于解决问题。
有什么想法吗?