2017-01-02 76 views
5

我從編碼中休息了幾個月,然後回過頭來發現CoreData與Xcode8/iOS10/macOS Sierra的變化。爲Xcode 8更新Objective C項目的正確方法核心數據NSManagedObject子類更改

我一直在試圖讓我的頭在目標C中的新NSManagedObject子類生成,但網絡上有很少。我有幾件事我之前,我開始屠殺我的項目,完全,但第一搞亂事情需要澄清,有些事情我已經從閒逛發現,可能是其他人在那裏有用...

東西在哪裏是

自動生成的文件深藏在DerivedData文件夾中。查看USER-> Library-> Developer-> Xcode-> DerivedData-> ProjectName-lotsOfRandomLetters-> Build然後繼續打開文件夾,直到找到DerivedSources-> CoreDataGenerated。

自動生成的文件不會出現在您的項目文件夾或導航器中,但如果在一個Xcode中出現錯誤,則會爲您顯示源代碼。

事情Xcode中產生

有三種代碼生成設置 - 手動/無,類定義和類別/擴展。

當實體CODEGEN被設置爲手動/無(這是舊的行爲)創建一個使用編輯器 - >創建NSManagedObject子類生成您的項目中的4個文件...

實體+ CoreDataClass.h的NSmanagedObject子和實體+ CoreDataClass.m和 實體+ CoreDataProperties.h和實體+ CoreDataProperties.m

(先前版本的Xcode 7產生Entity.h,Entity.m, 實體+ CoreDataProperties.h和實體+ CoreDataProperties.m文件)

如果e ntity的codegen被設置爲類定義,Xcode會在派生的數據文件夾中自動生成這4個相同的文件 - 不是項目,然後這些文件會標註一條評論,告訴您不要更改它們。

如果實體codegen設置爲Category/Extension,Xcode將生成2個文件。這些文件標有評論,告訴你不要改變它們。這是...

實體+ CoreDataProperties.h和實體+ CoreDataProperties.m

這2檔期待一個Entity.h文件要在項目,如果沒有將顯示一個錯誤在Xcode。這是您能夠在Xcode中查看其中一個文件的源代碼的一次。

什麼在這些文件

的+ CoreDataProperties文件顯示爲的Xcode那些產生先前版本生成的文件除了一個除了是相同的。它們包含實體/ NSmanagedObject的所有屬性/屬性以及處理具有一對多或多對多關係的實體的方法。新增功能是fetchRequest子類NSmanageObject的新fetchRequest方法的一種方法。

問題

1)是類定義現在的代碼生成時,你沒有任何額外的性能/功能添加到NSManagedObject子類,因爲它會自動更新的文件,你的明顯,最好的選擇(當你用cmd-s保存項目)?

2)使用+ CoreDataClass命名文件遵循類的約定,這意味着應該有一個類作爲它的擴展。

我是否正確地假設Entity + CoreDateClass.h/m文件是舊的Entity.h/m文件的直接替換?並且它不是一個類別,儘管文件名?

3)對於新的NSManagedObject子類,我應該導入Entity + CoreDataClass.h而不是Entity.h?

4)如果我想刪除我的大多數NSManagedObject子類的文件整齊我的項目,我不只是刪除在Xcode的文件和設置或CODEGEN類定義實體...

是有魔力下當您嘗試#import entity.h時,會尋找實體+ CoreDataClass的引擎蓋,或者我將不得不經過並找到#import entity.h的每個引用並將它們更改爲#import entity + CoreDataClass.h?

5)我的權利假設,如果我想要一個NSManagedObject的子類,我想添加一個屬性和一個方法,我應該設置Codegen到類別/擴展?如果我選擇類別/擴展我必須創建我自己的NSmanagedObject子類文件,其只是entity.h不是實體+ CoreDataClass.h? 7)如果entity + CoreDataClass.h是entity.h文件新接受的命名格式,爲什麼生成的Category/Extension文件尋找一個普通的entity.h名稱文件而不是實體+ CoreDataClass.h文件?這只是蘋果部分的一個不一致之處,我應該接受或者我錯過了我應該知道的東西?

謝謝。

+0

找到一些答案加上相應的WWDC視頻的鏈接[這裏](http://stackoverflow.com/a/39933534/1457385)。 – shallowThought

回答

2

好了 - 不少人看了一下,沒有答案,所以我會盡力,並回答自己。

1)是 - 如果你不需要額外的性能/功能添加到CoreData實體,去與類定義。這將創建4個文件: 實體+ CoreDataClass.h和實體+ CoreDataClass.m和實體+ CoreDataProperties.h和實體+ CoreDataProperties.m但你永遠不會看到他們,因爲他們是隱藏的從視線遙深導出的數據文件夾內。如果您需要檢查屬性名稱,則可以在覈心數據編輯器中查看,因爲您將無法訪問這些文件。

2)Entity + CoreDateClass.h/m文件是舊的Entity.h/m文件的直接替換。儘管對一個類別使用文件命名約定,但它們不是類別,不要讓Apple的命名系統讓你困惑。查看文件內部,並將類定義爲Entity not Entity + CoreDataClass。

3)對於新的NSManagedObject子類(使用「類定義」選項自動生成)導入Entity + CoreDataClass.h而不是Entity.h。畢竟'這是你正在導入的文件,而不是內部定義的類。當使用它的類只是實體不實體+ ...4)如果你決定刪除你的項目,刪除你的NSManagedObject子類文件,然後將實體的代碼轉換爲'類定義',你將需要通過項目並通過添加引用它們來更改所有的導入語句+ CoreDataClass爲文件名。幸運的是,與Xcode不同的是,它並沒有將它們標記爲錯誤,因此很容易找到它們。 5)是 - 如果你想向NSManagedObject子類添加屬性或功能,使用codegen「Category/Extension」選項。

6)如果你選擇分類/擴展你必須創建我自己的NSmanagedObject子類文件,將其命名爲Entity.h。不要將它命名爲Entity + CoreDataClass.h,因爲自動生成的Entity + CoreDataProperty.h正在尋找導入Entity.h文件。

7)是的,這只是蘋果公司命名上的不一致。不要讓它拋棄你,就像它一樣。

最後,不要忘了...

如果你走使用代碼生成的路徑 - >類別/擴展,如果你添加一個額外的關係,實體,你需要更新你的實體.h文件。例如,如果您添加了一個名爲Car的NSManagedObject子類的關係,您需要將@Class Car;添加到Entity.h。

相關問題