作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 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,它可能在辅助线程的主队列上运行。您有多种选择:
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/
我是一名优秀的程序员,十分优秀!