CoreDataStorage
使用 Combine 改善 CoreData
要求
使用与示例
连接
// Example Struct
struct Movie {
let id: String
let title: String
let releaseDate: Date
let desc: String
}
// Struct connect Entity
extension Movie: Entitable {
// Create toEntity Function
func toEntity(in context: NSManagedObjectContext) -> MovieEntity {
let entity: MovieEntity = .init(context: context)
entity.id = id
entity.title = title
entity.releaseDate = releaseDate
entity.desc = desc
return entity
}
}
// Entity connect Struct
extension MovieEntity: Objectable {
// Create toObject Function
public func toObject() -> some Entitable {
return Movie(id: id ?? UUID().uuidString,
title: title ?? "unknown",
releaseDate: releaseDate ?? Date(),
desc: desc ?? "")
}
}
CoreData存储
let coreDataStorage = CoreDataStorage.shared(name: "Storage Name")
// CoreDataStorage Function
func create<O>(_ value: O) -> AnyPublisher<O, Error> where O: Entitable
func read<O: Entitable>(type: O.Type, predicate: NSPredicate? = nil, sortDescriptors: [NSSortDescriptor]? = nil) -> AnyPublisher<[O], Error>
func update<O: Entitable>(_ updateObject: O, predicate: NSPredicate, limit: Int? = nil) -> AnyPublisher<[O], Error>
func update<O: Entitable>(type: O.Type, updateValues: [String: Any], predicate: NSPredicate) -> AnyPublisher<[O], Error>
func delete<O: Entitable>(_ type: O.Type, predicate: NSPredicate, limit: Int? = nil) -> AnyPublisher<[O], Error>
func deleteAll<O: Entitable>(_ type: O.Type) -> AnyPublisher<Bool, Error>
创建
// MARK: - Functions
func create<O>(_ value: O) -> AnyPublisher<O, Error> where O: Entitable
// MARK: - Example
func createMovie(movie: Movie) -> AnyPublisher<Movie, Error> {
return CoreDataStorage.shared(name: "MovieStorage").create(movie)
}
读取
// MARK: - Functions
func read<O: Entitable>(type: O.Type, predicate: NSPredicate? = nil, sortDescriptors: [NSSortDescriptor]? = nil) -> AnyPublisher<[O], Error>
// MARK: - Example
func readMovie(id: String) -> AnyPublisher<[Movie], Error> {
let predicate = NSPredicate(format: "id = %@", "\(id)")
return CoreDataStorage.shared(name: "MovieStorage").read(type: Movie.self, predicate: predicate)
}
func readAllMovie() -> AnyPublisher<[Movie], Error> {
return CoreDataStorage.shared(name: "MovieStorage").read(type: Movie.self)
}
更新
// MARK: - Functions
func update<O: Entitable>(_ updateObject: O, predicate: NSPredicate, limit: Int? = nil) -> AnyPublisher<[O], Error>
func update<O: Entitable>(type: O.Type, updateValues: [String: Any], predicate: NSPredicate) -> AnyPublisher<[O], Error>
// MARK: - Example
func updateMovie(movie: Movie) -> AnyPublisher<[Movie], Error> {
let predicate = NSPredicate(format: "id = %@", "\(movie.id)")
return CoreDataStorage.shared(name: "MovieStorage").update(movie, predicate: predicate)
}
func updateMovie(id: String) -> AnyPublisher<[Movie], Error> {
let predicate = NSPredicate(format: "id = %@", "\(movie.id)")
return CoreDataStorage.shared(name: "MovieStorage").update(Movie.self, updateValues: [title: "unknown"], predicate: predicate)
}
删除
// MARK: - Functions
func delete<O: Entitable>(_ type: O.Type, predicate: NSPredicate, limit: Int? = nil) -> AnyPublisher<[O], Error>
func deleteAll<O: Entitable>(_ type: O.Type) -> AnyPublisher<Bool, Error>
// MARK: - Example
func deleteMovie(id: String) -> AnyPublisher<[Movie], Error> {
let predicate = NSPredicate(format: "id = %@", "\(id)")
return CoreDataStorage.shared(name: "MovieStorage").delete(Movie.self, predicate: predicate)
}
func deleteAllMovies(movie: Movie) -> AnyPublisher<Bool, Error> {
return CoreDataStorage.shared(name: "MovieStorage").deleteAll(Movie.self)
}
Swift包管理器
- 文件 > Swift包 > 添加包依赖关系
- 添加 https://github.com/Jeonhui/CoreDataStorage
https://github.com/Jeonhui/CoreDataStorage
CocoaPods
CoreDataStorage可以通过CocoaPods获取。要安装它,只需将以下行添加到您的Podfile中
pod 'CoreDataStorage'
作者
Jeonhui, [邮箱地址隐藏]
许可协议
CoreDataStorage 可在 MIT 许可下使用。有关更多信息,请参阅 LICENSE 文件。