自定义Firebase数据服务类:Swift 3

Cha*_*993 5 ios firebase swift firebase-authentication firebase-realtime-database

我正在寻找一种从Swift的Firebase中检索(有时保存)数据的干净方法。令我烦恼的是,我所有的数据库调用都写在视图控制器代码的中间。因此,我正在寻找某种定制数据服务类。我发现本教程非常接近我想要的:http : //www.mobilecyberpunks.com/ ?p= 82

他们答应了第二部分,但我找不到第二部分,所以我想这从来没有做过。在第二部分中,他们承诺将使用此自定义数据服务介绍如何检索和保存数据(这对我来说是最重要的部分)。

我正在考虑一个API类(如本教程中所述),当我检索数据并完成从firebase的检索时,我将其保存在此api类的数据集中。然后,我将在通知中心发布通知。但是我不确定这是最佳做法还是执行此操作的好方法。

有没有人知道如何执行此操作(完成我发现的本教程或以其他方式完成)?

提前致谢!

Cha*_*993 4

我开始使用这个解决方案并对其进行了一些改进,然后我得到了一个非常方便的解决方案。

我创建了一个名为 FirebaseAPI 的自定义类。这是一个单例类。此类包含 Firebase 的所有方法(身份验证、数据库、存储……)。

例子:

FirebaseAPI.swift

import FirebaseAuth
import FirebaseDatabase 

class FirebaseAPI {
    static let shared = FirebaseAPI()

    private init() {}

    //Authentication
    func logInUser(onCompletion: @escaping (String?) -> Void {
        FIRAuth.auth().signInAnonymously(completion: {(user, error) in 
            if error == nil {
                onCompletion(user!.uid)
            } else {
                onCompletion(nil)
            }
        })
    }

    //Database
    func getObjects(parameter: ParamaterClass, onCompletion: @escaping ([ObjectClass]) -> Void) {
        Constants.Firebase.References.Object?.observe(.value, with: { snapshot in
            var objects = [ObjectClass]()

            if snapshot.exists() {
                for child in snapshot.children.allObjects {
                    let object = Object(snapshot: child as! FIRDataSnapshot)
                    objects.append(object)
                }
            }
            onCompletion(objects)
        })
    }
}
Run Code Online (Sandbox Code Playgroud)

常量.swift

import FirebaseDatabase 

struct Constants {
    struct Firebase {
        static var CurrentUser: FIRDatabaseReference?
        static var Objects: FIRDatabaseReference?
    }
}
Run Code Online (Sandbox Code Playgroud)

AppDelegate.swift

import UIKit
import Firebase 

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        FIRApp.configure()

        FirebaseAPI.shared.logInUser(onCompletion { uid in 
            if uid != nil {
                Constants.Firebase.References.CurrentUser = FIRDatabase.database().reference().child("users").child(uid!)
                Constants.Firebase.References.CurrentUser.keepSynced(true)

               Constants.Firebase.References.Objects = FIRDatabase.database().reference().child("objects")
               Constants.Firebase.Reference.Objects?.keepSynced(true)
            }
        })
    }
    return true
}
Run Code Online (Sandbox Code Playgroud)

我可以为您提供一个在 ViewController 中调用 FirebaseAPI 中的方法的示例,但此处的 AppDelegate.swift 代码中给出了此类方法的示例(FirebaseAPI.shared.logInUser 方法)。

到目前为止,在 3 个不同的项目中使用了这个结构,并且运行流畅!

  • 虽然你的代码没问题,但我记得我的 CTO(老板)在 iOS 应用程序开发(游戏和企业应用程序)方面非常有经验,他告诉我,我不应该让我的 AppDelegate 类变得臃肿。无论如何,您使用的是 Firebase 的 Observe 而不是 SingleObserve,而且您似乎没有删除观察者。我一直在为连接到 Firebase 的应用程序使用自定义类/API 服务,但仅限于 SingleObserveEvent。我正在发布有关此的问题,您可能想回答或感兴趣。 (2认同)