gpt4 book ai didi

ios - Core-Data 不保存在异步调用中

转载 作者:行者123 更新时间:2023-11-30 12:48:01 27 4
gpt4 key购买 nike

我正在尝试使用 Core Data 保存来自 Google Firebase 调用的数据。当我保存托管上下文时,它会保存,但是当我退出应用程序并重新打开它时,所有数据都消失了。

ref.child(exhibit).observeSingleEvent(of: .value, with: { snapshot in
for item in snapshot.children {
let animalObject = animal(snapshot: item as! FIRDataSnapshot)
let managedContext = self.appDelegate!.persistentContainer.viewContext
let animalEntity = NSEntityDescription.insertNewObject(forEntityName: "Animal", into: managedContext)
animalEntity.setValue(animalObject.name, forKeyPath: "name")
animalEntity.setValue(animalObject.information!, forKeyPath: "information")
animalEntity.setValue(animalObject.imageReference!, forKeyPath: "imageURL")
self.animals!.append(animalObject)

do {
try managedContext.save()
} catch let error as NSError {
print("Couldn not save. \(error), \(error.userInfo)")
}
}
})

我知道快照正确获取数据。我还尝试使用 forKey 作为参数名称而不是 forKeyPath 进行 setValue。

最佳答案

关键就在“异步”二字。您正在使用 appDelegate 中的 ManagedObjectContext,它可能在辅助线程的主队列上运行。您有多种选择:

  • 从快照收集数据,然后在主线程上调用保存到 appDelegate 的 ManagedObjectContext 的方法。通过发布通知也可以达到同样的目的。
  • 创建一个类型为 privateQueueConcurrencyType 的新的 ManagedObjectContext (init(concurrencyType:) 并将快照数据保存在 block 内 (performBlockAndWait())。详细信息可以在 NSManagedObjectContext reference 上找到

Objective-C 示例,假设已设置 self.persistentContainer 并且数据在 NSArray 字典中可用:`

- (void)saveData
{
NSManagedObjectContext *_privateContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
_privateContext.persistentStoreCoordinator = _persistentContainer.persistentStoreCoordinator;

__block __typeof__(self) blockSelf = self;
[_privateContext performBlock:^(void) {
NSError *error = nil;

for (NSDictionary *animalDict in blockSelf.dataArray) {
Animal *anAnimal = [Books managedObjectWithEntity:@"Animal" managedObjectContext:_privateContext];
anAnimal.name = [animalDict valueForKey:@"name"];
anAnimal.fluffiness = [animalDict valueForKey:@"fluffiness"];
}

if ([_privateContext save:&error]) {
NSLog(@"%@ %@ Data was added and saved", [blockSelf class], NSStringFromSelector(_cmd));
} else if (error) {
NSLog(@"%@ %@ %@", [blockSelf class], NSStringFromSelector(_cmd),
error.description); //type macerror <errornumber> in Terminal for more info
} else {
NSLog(@"%@ %@ Data was added but not saved", [blockSelf class], NSStringFromSelector(_cmd));
}
}];
}

关于ios - Core-Data 不保存在异步调用中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41373255/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com