相关疑难解决方法(0)

SwiftUI:删除所有核心数据实体条目后,列表不会自动更新

我知道 SwiftUI 使用状态驱动渲染。所以我假设,当我删除核心数据实体条目时,我的包含核心数据元素的列表会立即刷新。我使用此代码,它成功地清理了我的实体:

func deleteAll()
{
    let fetchRequest: NSFetchRequest<NSFetchRequestResult> = ToDoItem.fetchRequest()
    let deleteRequest = NSBatchDeleteRequest(fetchRequest: fetchRequest)

    let persistentContainer = (UIApplication.shared.delegate as! AppDelegate).persistentContainer

    do {
        try persistentContainer.viewContext.execute(deleteRequest)
    } catch let error as NSError {
        print(error)
    }
}
Run Code Online (Sandbox Code Playgroud)

为了让我的视图中的列表视觉上为空,我必须在之后离开视图(例如使用“self.presentationMode.wrappedValue.dismiss()”)并再次打开它。好像这些值仍然存储在内存中的某个地方。这当然不是用户友好的,我确信我只是监督了一些可以立即刷新列表的内容。也许有人可以帮忙。

core-data swift swiftui

13
推荐指数
2
解决办法
3746
查看次数

SwiftUI @FetchRequest 对关系的核心数据更改不刷新

Node具有name, createdAt, 多对多关系children和一对一关系parent(均为可选)的实体的核心数据模型。使用 CodeGen 类定义。

使用@FetchRequest带有 谓词的 a parent == nil,可以获取根节点并随后使用关系遍历树。

根节点 CRUD 可以很好地刷新视图,但对子节点的任何修改在重新启动之前都不会显示,尽管更改已保存在 Core Data 中。

下面代码中最简单的示例说明了子节点删除的问题。删除在 Core Data 中有效,但如果删除是在子级上,则视图不会刷新。如果在根节点上,视图刷新工作正常。

我是 Swift 的新手,所以如果这是一个相当基本的问题,我很抱歉,但是如何在更改子节点时刷新视图?

import SwiftUI
import CoreData

extension Node {

    class func count() -> Int {
        let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
        let fetchRequest: NSFetchRequest<Node> = Node.fetchRequest()

        do {
            let count = try context.count(for: fetchRequest)
            print("found nodes: \(count)")
            return count
        } catch let error as NSError {
            fatalError("Unresolved …
Run Code Online (Sandbox Code Playgroud)

core-data swift swiftui combine

6
推荐指数
1
解决办法
1508
查看次数

FetchedResults 不会触发和 SwiftUI 更新但上下文成功保存它

我正在尝试通过 NSManagedObject 更新我的核心数据中的属性。一旦我更新它,我就会保存上下文并成功保存。

问题

上下文保存后,UI (SwiftUI) 不会用新值更新它。如果我将一个全新的 Children 添加到 Core Data(插入)中,则 UI 会更新。

我试过的:

  1. Asperi 方法- 我可以在 .onReceive 中打印出正确的新值,但 UI 不会更新
  2. 在 context.save() 之前使用 self.objectWillChange.send() - 也不起作用
  3. 将 Int16 更改为 String,因为我推测 Int16 不知何故不可观察?也没有用

这是一个 SwiftUI 错误吗?现状

//only updating the data 
let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext        
let fetchReq = NSFetchRequest<Card>(entityName: "Card") //filter distributorID; should return only one Card
fetchReq.resultType = .managedObjectResultType
fetchReq.predicate = NSPredicate(format: "id == %@", params["id"]!) //I get an array with cards
var cards :[Card] = [] …
Run Code Online (Sandbox Code Playgroud)

iphone core-data ios swiftui

6
推荐指数
1
解决办法
472
查看次数

如何使用 NSPersistentCloudKitContainer 和 SwiftUI 手动获取 CloudKit 数据以更新 UI?

假设我们有一个有效的 NSPersistentCloudKitContainer 和一个名为 Item 的 CoreData 实体。假设我们想要在 iOS、iPad 和 Mac 应用程序之间同步。

我观看了有关同步 CoreData 和 CloudKit 的 WWDC 会议,并在我的 SwiftUI 应用程序中实现了基本同步。它可以工作,数据会发送到所有 3 台设备并自动同步。

但是在 Mac 上,如果不重新加载视图(以及在模拟器中(因为它们没有收到推送通知),数据就不会出现。它来了,但没有自动刷新。我还测试了模拟器到真实设备,有时它会自动同步,有时我需要重新打开应用程序才能看到更改。

我很好奇是否有一种可以与 NSPersistentCloudKitContainer 一起使用的强制获取方法。或者也许有人知道在使用 NSPersistentCloudKitContainer 和 SwiftUI 时手动重新获取数据的解决方法?

我还想在新数据开始出现时显示一个活动指示器,但不确定在代码中从哪里开始获取获取点?

我使用了 Apple 提供的这个 UIKit示例代码,并将其调整为在 SwiftUI 中工作。我还阅读了此处的所有文档。

这是我使用的persistentContainer代码:

lazy var persistentContainer: NSPersistentCloudKitContainer = {

        let container = NSPersistentCloudKitContainer(name: "AppName")

        container.persistentStoreDescriptions.first?.setOption(true as NSNumber, forKey: NSPersistentStoreRemoteChangeNotificationPostOptionKey)

        container.loadPersistentStores(completionHandler: { (storeDescription, error) in
            if let error = error as NSError? {

                fatalError("Unresolved error \(error), \(error.userInfo)")
            } …
Run Code Online (Sandbox Code Playgroud)

core-data ios cloudkit swiftui nspersistentcloudkitcontainer

5
推荐指数
1
解决办法
2000
查看次数

SwiftUI CloudKit 在保持活动状态时不刷新视图

我正在使用 SwiftUI 开发 macOS 和 iOS 应用程序。两者都使用 CoreData 和 iCloudKit 在两个平台之间同步数据。它确实与同一个 iCloud 容器配合得很好。

我遇到一个问题,即停留在应用程序中时不会触发 iCloud 后台更新。如果我在两个系统上进行更改,则会推送更改,但在其他设备上不可见。

我需要重新加载应用程序、关闭应用程序并再次打开,或者在 Mac 应用程序中失去焦点并返回到它。然后我的List就会刷新。我不知道为什么它不起作用,同时留在应用程序内而不失去焦点。

我在 Stackoverflow 上读到了几个线程,但是它们对我不起作用。这是我在 iOS 中的简单视图

struct ContentView: View {
    
    @Environment(\.managedObjectContext) var managedObjectContext
    
    @State private var refreshing = false
    private var didSave =  NotificationCenter.default.publisher(for: .NSManagedObjectContextDidSave)

    @FetchRequest(entity: Person.entity(), sortDescriptors: []) var persons : FetchedResults<Person>
    
    var body: some View {
        NavigationView
        {
            List()
            {
                ForEach(self.persons, id:\.self) { person in
                    Text(person.firstName + (self.refreshing ? "" : ""))
                    // here is the listener for …
Run Code Online (Sandbox Code Playgroud)

core-data ios icloud swift swiftui

5
推荐指数
1
解决办法
2275
查看次数