FirestoreClient 0.1.0

FirestoreClient 0.1.0

Anas Alhasani 维护。



 
依赖于
Firebase/Core>= 0
Firebase/Firestore>= 0
FirebaseFirestoreSwift>= 0
PromisesSwift>= 0
 

FirestoreClient🔥

codebeat badge

Firestore 上方的通用抽象层。

使用的库

  • Firebase/Firestore: 一个可扩展的 NoSQL 云数据库,用于存储和同步客户端和服务器端开发的数据。
  • Google/Promises: 一个现代框架,为 Swift 提供一个同步构造,以方便编写异步代码。
  • Identity: 一个小型库,让在 Swift 中创建类型安全标识符变得简单。

特性

  • 支持 Codable。
  • 支持 Promises。
  • 提供易于使用的读写操作。
  • 基于 KeyPath 的查询构建器。
  • 类型安全标识符。

使用方法

实体

您的模型必须符合 实体 协议,而该协议符合 可编码 协议。例如

struct Book: Entity {
    var id: ID = ""
    var title: String
    var author: String
    var releaseDate: Date?
    var pages: Int
}

符合 查询键 协议以启用键路径查询。

extension Book: QueryKey {
    static var keys: [PartialKeyPath<Book>: CodingKey] {
        return [
            \Self.id: CodingKeys.id,
            \Self.title: CodingKeys.title,
            \Self.author: CodingKeys.author,
            \Self.releaseDate: CodingKeys.releaseDate,
            \Self.pages: CodingKeys.pages
        ]
    }
}

用途场景

用途场景是一个执行特定任务的协议。

protocol BooksUseCase {
    func loadBooks() -> Promise<[Book]>
    func loadBook(byID id: Book.ID) -> Promise<Book>
    func saveBook(_ book: Book) -> Promise<Void>
    func updateBook(_ book: Book) -> Promise<Void>
    func deleteBook(byID id: Book.ID) -> Promise<Void>
}

BooksUseCase 具体实现的示例。

final class DefaultBooksUseCase<Repository: AbstractRepository> where Repository.Value == Book {
    private let repository: Repository
    
    init(repository: Repository) {
        self.repository = repository
    }
}

extension DefaultBooksUseCase: BooksUseCase {
    func loadBooks() -> Promise<[Book]> {
        return repository.query {
            $0.filter(by: \.author, equal: "George R. R. Martin")
              .order(by: \.releaseDate)
              .limit(to: 5)
        }
    }
    
    func loadBook(byID id: Book.ID) -> Promise<Book> {
        return repository.fetch(byID: id)
    }
    
    func saveBook(_ book: Book) -> Promise<Void> {
        return repository.save(entity: book)
    }
    
    func updateBook(_ book: Book) -> Promise<Void> {
        return repository.update(entity: book)
    }
    
    func deleteBook(byID id: Book.ID) -> Promise<Void> {
        return repository.delete(byID: id)
    }
}

用途场景工厂

它有助于隐藏用途场景的具体实现。

protocol UseCaseFactory {
    func makeBooksUseCase() -> BooksUseCase
}

final class DefaultUseCaseFactory: UseCaseFactory {
    func makeBooksUseCase() -> BooksUseCase {
        let path = Path("books")
        let repository = FirestoreRepository<Book>(path: path)
        return DefaultBooksUseCase(repository: repository)
    }
}

安装

CocoaPods

CocoaPods 是一个用于 Cocoa 项目的依赖关系管理器。有关使用和安装说明,请访问其网站。要使用 CocoaPods 将 FirestoreClient 集成到您的 Xcode 项目中,请在您的 Podfile 中指定它。

pod 'FirestoreClient', :git => 'https://github.com/AnasAlhasani/FirestoreClient'

然后,运行以下命令

$ pod install

作者

Anas Alhasani

GitHub Follow