自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

如何結(jié)合 Core Data 和 SwiftUI

開(kāi)發(fā) 前端
SwiftUI 和 Core Data 之間相差將近十年 —— SwiftUI 隨著 iOS 13 面世而 Core Data 則是 iPhoneOS 3 的產(chǎn)物;很久以前,它還沒(méi)有被稱為 iOS,因?yàn)?iPad 尚未發(fā)布。盡管時(shí)間相距遙遠(yuǎn),Apple 還是投入了大量工作以確保這兩種強(qiáng)大的技術(shù)能夠完美地相互配合使用,這意味著 Core Data 就像始終以這種方式設(shè)計(jì)一樣,已集成到 SwiftUI 中。

[[410983]]

本文轉(zhuǎn)載自微信公眾號(hào)「Swift社區(qū)」,作者韋弦Zhy 。轉(zhuǎn)載本文請(qǐng)聯(lián)系Swift社區(qū)公眾號(hào)。

core data stack

SwiftUI 和 Core Data 之間相差將近十年 —— SwiftUI 隨著 iOS 13 面世而 Core Data 則是 iPhoneOS 3 的產(chǎn)物;很久以前,它還沒(méi)有被稱為 iOS,因?yàn)?iPad 尚未發(fā)布。盡管時(shí)間相距遙遠(yuǎn),Apple 還是投入了大量工作以確保這兩種強(qiáng)大的技術(shù)能夠完美地相互配合使用,這意味著 Core Data 就像始終以這種方式設(shè)計(jì)一樣,已集成到 SwiftUI 中。

在此項(xiàng)目中,我們將僅使用少量 Core Data 的功能,但是這種功能將很快擴(kuò)展——我只想首先了解一下它。當(dāng)您創(chuàng)建 Xcode 項(xiàng)目時(shí),我要求您選中 Use Core Data 框,它應(yīng)該導(dǎo)致對(duì)項(xiàng)目的更改:

  • 現(xiàn)在,您有了一個(gè)名為 Bookworm.xcdatamodeld 的文件。這描述了您的數(shù)據(jù)模型,該數(shù)據(jù)模型實(shí)際上是類及其屬性的列表。
  • AppDelegate.swift 和 SceneDelegate.swift 中現(xiàn)在有用于設(shè)置 Core Data 的額外代碼。

設(shè)置核心數(shù)據(jù)需要兩個(gè)步驟:創(chuàng)建所謂的持久性容器(從容器存儲(chǔ)中加載并保存實(shí)際數(shù)據(jù)),然后將其注入 SwiftUI 環(huán)境中,以便我們所有的視圖都可以訪問(wèn)它。

Xcode 模板已經(jīng)為我們完成了這兩個(gè)步驟。

因此,剩下的就是我們要決定要在 Core Data 中存儲(chǔ)哪些數(shù)據(jù),以及如何讀出這些數(shù)據(jù)。首先,我們需要打開(kāi) Bookworm.xcdatamodeld 并開(kāi)始使用 Xcode 的模型編輯器描述我們的數(shù)據(jù)。

之前我們描述過(guò)這樣的數(shù)據(jù):

  1. struct Student { 
  2.     var id: UUID 
  3.     var name: String 

但是,Core Data 不能那樣工作。您會(huì)看到,Core Data 需要提前知道我們所有數(shù)據(jù)類型的樣子,包含的內(nèi)容以及它們之間的關(guān)系。這就是 “xcdatamodeld” 文件的來(lái)源:我們將類型定義為“實(shí)體”,然后在其中創(chuàng)建屬性作為“屬性”,Core Data 負(fù)責(zé)將其轉(zhuǎn)換為可以在運(yùn)行時(shí)使用的實(shí)際數(shù)據(jù)庫(kù)布局。

為了進(jìn)行試用,請(qǐng)點(diǎn)擊 “Add Entity” 按鈕創(chuàng)建一個(gè)新實(shí)體,然后雙擊其名稱將其重命名為 “Student”。接下來(lái),單擊 “Attributes”表正下方的+按鈕以添加兩個(gè)屬性:“id”作為 UUID 和 “name” 作為字符串。這將告訴 Core Data 創(chuàng)建學(xué)生并保存他們所需的一切,因此請(qǐng)回到 ContentView.swift,以便我們編寫(xiě)一些代碼。

使用獲取請(qǐng)求從 Core Data 中檢索信息——我們描述了我們想要的內(nèi)容,應(yīng)如何對(duì)其進(jìn)行排序以及是否應(yīng)使用任何過(guò)濾器,然后 Core Data 會(huì)發(fā)回所有匹配的數(shù)據(jù)。我們需要確保該獲取請(qǐng)求隨著時(shí)間的推移保持最新,以便在創(chuàng)建或刪除學(xué)生時(shí),我們的 UI 保持同步。

SwiftUI 有一個(gè)解決方案,而且——您猜對(duì)了——這是另一個(gè)屬性包裝器。這次將其稱為@FetchRequest,它帶有兩個(gè)參數(shù):我們要查詢的實(shí)體以及我們希望結(jié)果如何排序。它具有非常特定的格式,因此,我們首先為學(xué)生添加獲取請(qǐng)求——請(qǐng)立即將此屬性添加到 ContentView:

 

  1. @FetchRequest(entity: Student.entity(), sortDescriptors: []) var students: FetchedResults<Student> 

分解之后,這創(chuàng)建了一個(gè)獲取的“學(xué)生”實(shí)體的請(qǐng)求,不進(jìn)行任何排序,而是將其放入名稱為students,類型為FetchedResults的屬性中。

從那里開(kāi)始,我們可以像常規(guī)的 Swift 數(shù)組一樣開(kāi)始使用學(xué)生,但是您會(huì)發(fā)現(xiàn)有一個(gè)陷阱。首先,一些將數(shù)組放入List的代碼:

  1. var body: some View { 
  2.     VStack { 
  3.         List { 
  4.             ForEach(students, id: \.id) { student in 
  5.                 Text(student.name ?? "Unknown"
  6.             } 
  7.         } 
  8.     } 

你發(fā)現(xiàn)異常了嗎?是的,student.name是可選的——它可能有一個(gè)值,也可能沒(méi)有。這是 Core Data 的一個(gè)領(lǐng)域,該領(lǐng)域會(huì)讓您大為惱火:它具有可選數(shù)據(jù)的概念,但與 Swift 的可選數(shù)據(jù)完全不同。如果我們對(duì) Core Data 說(shuō)“這不是必須的”(您可以在模型編輯器中完成),它仍然會(huì)生成可選的 Swift 屬性,因?yàn)樗?Core Data 關(guān)心的是屬性在保存時(shí)具有值——在其他時(shí)間它們可以為 nil。

您可以根據(jù)需要運(yùn)行代碼,但沒(méi)有太多意義——該列表將為空,因?yàn)槲覀兩形刺砑尤魏螖?shù)據(jù),因此我們的數(shù)據(jù)庫(kù)為空。為了解決這個(gè)問(wèn)題,我們將在列表下方創(chuàng)建一個(gè)按鈕,每次點(diǎn)擊都會(huì)添加一個(gè)新的隨機(jī)學(xué)生,但是首先我們需要一個(gè)新屬性來(lái)存儲(chǔ)托管對(duì)象上下文。

讓我重申一下,因?yàn)檫@很重要。當(dāng)我們定義 “Student” 實(shí)體時(shí),實(shí)際上發(fā)生的是 Core Data 為我們創(chuàng)建了一個(gè)類,該類繼承自其自身的一個(gè)類:NSManagedObject。我們無(wú)法在代碼中看到該類,因?yàn)樗窃跇?gòu)建項(xiàng)目時(shí)自動(dòng)生成的,就像 Core ML 的模型一樣。這些對(duì)象之所以稱為托管對(duì)象,是因?yàn)?Core Data 會(huì)照料它們:它從持久性容器中加載它們并將它們的更改也寫(xiě)回。

我們所有的托管對(duì)象都位于托管對(duì)象上下文中,該上下文負(fù)責(zé)實(shí)際獲取托管對(duì)象以及保存更改等。如果需要的話,您可以有許多托管對(duì)象上下文,但這距離現(xiàn)在還有一段路要走——實(shí)際上,您可以長(zhǎng)期使用它。

我們不需要?jiǎng)?chuàng)建此托管對(duì)象上下文,因?yàn)?Xcode 已經(jīng)為我們創(chuàng)建了一個(gè)。更好的是,它已經(jīng)將其添加到 SwiftUI 環(huán)境中,這就是@FetchRequest屬性包裝器起作用的原因——它使用了環(huán)境中可用的任何托管對(duì)象上下文。

因此,現(xiàn)在將此屬性添加到ContentView:

  1. @Environment(\.managedObjectContext) var moc 

設(shè)置好之后,下一步是添加一個(gè)按鈕,該按鈕生成隨機(jī)的學(xué)生并將其保存在托管對(duì)象上下文中。為了幫助學(xué)生脫穎而出,我們將通過(guò)創(chuàng)建firstNames和lastNames數(shù)組來(lái)分配隨機(jī)名稱,然后使用randomElement()從中選擇一個(gè)。

首先在List下方添加此按鈕:

  1. Button("Add") { 
  2.     let firstNames = ["Ginny""Harry""Hermione""Luna""Ron"
  3.     let lastNames = ["Granger""Lovegood""Potter""Weasley"
  4.  
  5.     let chosenFirstName = firstNames.randomElement()! 
  6.     let chosenLastName = lastNames.randomElement()! 
  7.  
  8.     // more code to come         

**注意:**不可避免地有人會(huì)抱怨我強(qiáng)行對(duì)randomElement()調(diào)用,但是實(shí)際上我們只是手工創(chuàng)建了具有值的數(shù)組——它將永遠(yuǎn)成功。如果您非常討厭強(qiáng)制拆包,則可以將其替換為空合計(jì)算和默認(rèn)值。

現(xiàn)在,有趣的部分是:我們將使用為我們生成的 Core Data 類創(chuàng)建一個(gè) Student對(duì)象。這需要附加到托管對(duì)象上下文中,以便對(duì)象知道應(yīng)將其存儲(chǔ)在何處。然后,我們可以像通常為結(jié)構(gòu)體那樣分配值。

因此,現(xiàn)在將這三行添加到按鈕的操作閉包中:

  1. let student = Student(context: self.moc) 
  2. student.id = UUID() 
  3. student.name = "\(chosenFirstName) \(chosenLastName)" 

最后,我們需要詢問(wèn)托管對(duì)象上下文以保存自身。這是一個(gè)引發(fā)函數(shù)的調(diào)用,因?yàn)槔碚撋纤赡軙?huì)失敗。實(shí)際上,我們所做的一切都沒(méi)有失敗的可能,因此我們可以使用try?來(lái)調(diào)用它——–我們不在乎捕獲錯(cuò)誤。

因此,請(qǐng)將最后一行添加到按鈕的操作中:

  1. try? self.moc.save() 

最后,您現(xiàn)在應(yīng)該可以運(yùn)行該應(yīng)用程序并對(duì)其進(jìn)行嘗試——單擊幾次 “Add” 按鈕以生成一些隨機(jī)的學(xué)生,您應(yīng)該看到他們滑入我們列表的某個(gè)位置。更好的是,如果您重新啟動(dòng)該應(yīng)用程序,您會(huì)發(fā)現(xiàn)學(xué)生還在,因?yàn)?Core Data 已保存了他們。

現(xiàn)在,您可能認(rèn)為這需要大量的學(xué)習(xí),但并不會(huì)帶來(lái)很多結(jié)果,但是您現(xiàn)在知道什么是實(shí)體和屬性,知道什么是托管對(duì)象和請(qǐng)求,并且已經(jīng)了解了如何保存更改。在此項(xiàng)目的后面以及將來(lái),我們都將更多地關(guān)注 Core Data,但到目前為止,您已經(jīng)走了很遠(yuǎn)。

 

責(zé)任編輯:武曉燕 來(lái)源: Swift社區(qū)
相關(guān)推薦

2013-12-13 09:55:12

SQLite數(shù)據(jù)庫(kù)

2024-05-17 09:01:24

Swift數(shù)據(jù)模型Core Data

2015-09-02 09:40:21

core data工具開(kāi)源庫(kù)

2015-10-19 11:06:42

CoreDate開(kāi)源庫(kù)

2011-07-21 14:50:06

Core Data SQL

2011-06-14 14:27:02

Core DataCocoa TouchiOS

2024-05-17 09:00:45

SwiftUIvisionOS

2022-09-19 09:01:35

HStackVStackSwiftUI

2011-08-19 17:44:01

2024-07-03 09:13:26

SwiftUI修飾符框架

2021-08-16 12:13:02

SwiftUIList ArticleList

2012-04-19 10:04:20

ibmdw

2023-05-26 17:21:15

PythonRust

2022-11-11 09:01:08

SwiftUI條形圖子視圖

2023-09-20 12:13:47

開(kāi)發(fā)模型

2021-11-26 12:00:07

包裝器SwiftU結(jié)構(gòu)體

2010-08-10 16:41:54

FlexJSP

2020-06-02 09:28:46

大數(shù)據(jù)物聯(lián)網(wǎng)IOT

2019-11-14 09:20:15

CentOS 8RHEL 8Nagios Core

2021-12-24 08:55:58

蘋果 iOS 15 SwiftUI
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)