从Firebase Storage同步获取数据Swift4

我将一些文件上传到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 StorageMeat.json json文件的Chicken.json完整路径。

Meat.json文件包含Firebase Storage文件的newMeat.jpg完整路径。

Chicken.json文件包含Firebase Storagechicken1.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函数异步工作这一事实有关,因此,我的数据结构返回空。

我不是第一个想要实现类似目标的人。

我看到了一些有关和观察员的帖子,但这无助于解决问题。

有什么想法吗?

lyloney 回答:从Firebase Storage同步获取数据Swift4

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3044671.html

大家都在问