簡體   English   中英

如何在 UIKit 項目的單個 swift UI 視圖中訪問 CoreData

[英]How to access CoreData in a single swift UI view with in the UIKit Project

我有一個我在 UIKit 開發的項目,但現在慢慢遷移到 Swift UI..我之前已經寫了我所有的 CoreData 邏輯,現在我想在我的 Swift UI 中訪問 CoreData 上下文......

在這里從 viewcontroller 添加 Swift UI 視圖,如下所示

    let swiftUIView = ListView(date: self.date, context: context, userSession: userSession, scheduleViewModel: viewModel)
    addSubSwiftUIView(swiftUIView, to: containerView)

Swift 用戶界面在這里查看

struct ListView: View {
    let date: Date
    let context: NSManagedObjectContext
    let userSession: UserSessionTrait
    @MainActor class ViewModel: ObservableObject {}
    @StateObject private var viewModel = ViewModel()

    var body: some View {
        ScrollViewReader { scrollView in
            FilteredList(date: date, context: context, userSession: userSession) { (appointment: Appointment) in
                ScheduleRowView(appointment: appointment)
                    .id(appointment)
            }
            .environment(\.managedObjectContext, context)
        }
        .listStyle(.grouped)
    }
  }

struct FilteredList<T: NSManagedObject, Content: View>: View {
    @FetchRequest var fetchRequest: FetchedResults<Appointment>

    // this is our content closure; we'll call this once for each item in the list
    let content: (Appointment) -> Content

    var body: some View {
        List(fetchRequest, id: \.self) { appointment in
            self.content(appointment)
        }
    }

    init(date: Date, context: NSManagedObjectContext, userSession: UserSessionTrait, @ViewBuilder content: @escaping (Appointment) -> Content) {
        _fetchRequest = FetchRequest(fetchRequest: Appointment.sortedFetchRequest(in: context, userId: userSession.userId, date: date))
        self.content = content
    }
}

但是,當我加載此應用程序時,它因訪問不當而崩潰,並且它也在減慢這一行的bacz .environment(.managedObjectContext, context) 所以我的問題

  1. 是否可以在非 swiftUi 項目中訪問 CoreData 石灰
  2. 有什么解決方法嗎

提前致謝

您必須將上下文從 UIKit 傳遞到 SwiftUI 環境中。 您可以在舊的 Xcode SwiftUI 核心數據模板(我相信 v12)中看到它,然后我們有 SwiftUI 應用程序生命周期(抱歉,我沒有那個方便)。 它也在這個 Wenderlich 教程中。

let context = persistentContainer.viewContext
let contentView = MovieList().environment(\.managedObjectContext, context)

此外,我建議刪除您的視圖 model 對象,我們不使用 SwiftUI 中的對象。對於 SwiftUI 生成的 UIKit 視圖,視圖數據結構是 model。 給定它的值類型,我們消除了對象可能出現的錯誤。 如果您在頂部添加對象,那么您就有可能添加 SwiftUI 旨在消除的錯誤。

FetchRequest header 中有一個提示,您可能會發現它很方便:

/// If you need to separate the request and the result
/// entities, you can declare `quakes` in two steps by
/// using the request's `wrappedValue` to obtain the results:
///
///     var fetchRequest = FetchRequest<Quake>(fetchRequest: request)
///     var quakes: FetchedResults<Quake> { fetchRequest.wrappedValue }

因此,您不必使用屬性包裝器@FetchRequest並且可以將FetchRequest用作動態屬性。 在動態屬性中, update函數在主體運行之前被調用,這就是FetchRequest從環境中檢索上下文的方式。

所以例如你可以這樣做:

private var fetchRequest: FetchRequest<Appointment>
private var appointments: FetchedResults<Appointment> {
    fetchRequest.wrappedValue
}

init(date: Date) {
    fetchRequest = FetchRequest( // use date
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM