從Xcode8開始溉箕,Apple在Xcode數(shù)據(jù)模型編輯器中添加了新的Codegen設(shè)置,以幫助開發(fā)人員管理和維護其NSManagedObject子類岔擂。 Codegen設(shè)置包含3種可能的配置
- Manual/None
- Class Definition
- Category/Extension
最初唉窃,這3種配置可能看起來有些混亂,我發(fā)現(xiàn)實際上很難找到一篇很好的文章來解釋每種配置之間的區(qū)別以及使用哪種配置罪裹。
在本文中,我將詳細介紹每種配置运挫,并分析每種配置之間的差異状共,并提出一些建議,說明應(yīng)該在核心數(shù)據(jù)項目中使用哪種配置以及如何使用它谁帕。事不宜遲峡继,讓我們開始吧!
Manual/None
這是Xcode8之前的默認行為匈挖,開發(fā)人員必須手動創(chuàng)建和維護NSManagedObject子類的更改碾牌。
TestEntity+CoreDataClass.swift
TestEntity+CoreDataProperties.swift
生成這兩個文件后,您應(yīng)該可以在項目中使用TestEntity儡循。嘗試將以下代碼行復(fù)制到您的應(yīng)用程序委托中小染,您的項目應(yīng)編譯沒有任何錯誤。
let _ = TestEntity(context: persistentContainer.viewContext)
Class Definition
在數(shù)據(jù)模型編輯器中創(chuàng)建實體時贮折,此配置是默認的Codegen配置。使用此配置资盅,Xcode將自動生成所需的NSManagedObject子類调榄,作為項目派生數(shù)據(jù)的一部分。
現(xiàn)在呵扛,不用手動創(chuàng)建TestEntity + CoreDataClass.swift和TestEntity + CoreDataProperties.swift)每庆。但是請注意,這兩個文件均不在您的Xcode項目中今穿,實際上它們都位于Xcode的“Derived Data”文件夾中缤灵。
切勿編輯自動生成的文件,因為它們由Xcode管理,因此腮出,每次構(gòu)建項目時帖鸦,它們都會被Xcode覆蓋。
Category/Extension
可以在“類定義”和“手動/無”之間描述此配置胚嘲。 Xcode只會自動為您生成TestEntity + CoreDataProperties.swift作儿,而您將必須自己管理和維護TestEntity + CoreDataClass.swift。
請告訴我使用哪個
希望上面的解釋可以使您對每個Codegen配置的工作方式有一個更清晰的了解馋劈。但是攻锰,您應(yīng)該在下一個CoreData項目中使用哪一個呢?
Class Definition
此配置非常適合開發(fā)簡單的應(yīng)用程序或在原型開發(fā)階段妓雾。在編輯數(shù)據(jù)模型時娶吞,您不必擔(dān)心更新或維護NSManagedObject子類,Xcode會為您解決械姻。但是妒蛇,您對NSManagedObject子類沒有任何控制權(quán),因此導(dǎo)致此配置使用起來不太靈活策添。Category/Extension
此配置適用于大多數(shù)核心數(shù)據(jù)應(yīng)用程序材部。大多數(shù)情況下,更新數(shù)據(jù)模型時無需執(zhí)行任何操作唯竹。但是乐导,您可以靈活地將所需的任何自定義函數(shù)添加到NSManagedObject子類中。讓我們看一下以下用例:
假設(shè)您的TestEntity有一個名為base64的屬性浸颓,它表示圖像的base64編碼字符串物臂。通過使用Category / Extension配置,可以通過添加名為image的計算屬性和有助于執(zhí)行base64編碼/解碼操作的自定義函數(shù)來定制iseTestEntity + CoreDataClass.swift产上。這是TestEntity + CoreDataClass.swift的示例
import Foundation
import CoreData
import UIKit
@objc(TestEntity)
public class TestEntity: NSManagedObject {
var image: UIImage {
set {
base64 = base64(from: image)
}
get {
return image(from: base64!)
}
}
}
extension TestEntity {
func base64(from image: UIImage) -> String {
// ************************************** //
// UIImage to base64 encoding logic here! //
// ************************************** //
return "base64-encoded-string"
}
func image(from base64: String) -> UIImage {
// ************************************** //
// base64 to UIImage decoding logic here! //
// ************************************** //
return UIImage()
}
}
要將值設(shè)置為base64棵磷,您只需要兩行代碼即可:
let entity = TestEntity(context: persistentContainer.viewContext)
entity.image = UIImage(named: "sample-image")!
- Manual/None
在大多數(shù)情況下,類別/擴展配置足以滿足您的核心數(shù)據(jù)應(yīng)用程序的需求晋涣。但是仪媒,如果您需要更全面的掌控系統(tǒng),則可以使用“手動/無”配置將其更進一步谢鹊。讓我們重新看一下以前的base64示例算吩,看看如何從那里改進。
由于您的代碼僅訪問TestEntity的圖像佃扼,因此應(yīng)通過將base64屬性設(shè)置為私有來對其進行封裝偎巢。此外,如果您知道base64絕不能為nil兼耀,也可以將base64設(shè)為非可選屬性
要實現(xiàn)此目的压昼,請從TestEntity + CoreDataProperties.swift中刪除base64聲明求冷,并在TestEntity + CoreDataClass.swift中添加一個非可選的私有base64聲明。
import Foundation
import CoreData
extension TestEntity {
@nonobjc public class func fetchRequest() -> NSFetchRequest<TestEntity> {
return NSFetchRequest<TestEntity>(entityName: "TestEntity")
}
}
import Foundation
import CoreData
import UIKit
@objc(TestEntity)
public class TestEntity: NSManagedObject {
@NSManaged private var base64: String
var image: UIImage {
set {
base64 = base64(from: image)
}
get {
return image(from: base64)
}
}
}
extension TestEntity {
func base64(from image: UIImage) -> String {
// ************************************** //
// UIImage to base64 encoding logic here! //
// ************************************** //
return "base64-encoded-string"
}
func image(from base64: String) -> UIImage {
// ************************************** //
// base64 to UIImage decoding logic here! //
// ************************************** //
return UIImage()
}
}
功能強大窍霞,責(zé)任重大……通過使用“手動/無代碼生成”配置匠题,Xcode不再為您維護NSManagedObject子類,因此官撼,每次對數(shù)據(jù)模型進行更改時梧躺,您都必須手動對其進行更新。
總結(jié)
如果您不熟悉核心數(shù)據(jù)傲绣,則可以從“類定義”配置開始掠哥。熟悉核心數(shù)據(jù)并希望對NSManagedObject類有更多控制后,您可以隨時切換項目以使用其他適合您項目需求的Codegen配置秃诵。
技術(shù)交流
QQ:3365059189
SwiftUI技術(shù)交流QQ群:518696470
- 請關(guān)注我的專欄icloudend, SwiftUI教程與源碼