我知道 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()”)并再次打开它。好像这些值仍然存储在内存中的某个地方。这当然不是用户友好的,我确信我只是监督了一些可以立即刷新列表的内容。也许有人可以帮忙。
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) 我正在尝试通过 NSManagedObject 更新我的核心数据中的属性。一旦我更新它,我就会保存上下文并成功保存。
问题
上下文保存后,UI (SwiftUI) 不会用新值更新它。如果我将一个全新的 Children 添加到 Core Data(插入)中,则 UI 会更新。
我试过的:
这是一个 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) 假设我们有一个有效的 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
我正在使用 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)