Мы запускаем приложение через Citrix Secure Hub, иногда возникает откат с потерей некоторых данных в CoreData.
Как я понимаю, CoreData имеет что-то вроде рабочей копии всех объектов, а иногда пытается сохранить это в файловой системе.
Хорошо пытались смоделировать поведение, но безуспешно, мы не могли обнаружить потерю данных или откат данных в нашей тестовой среде.
Так есть ли способ заставить iOS записать текущую «рабочую копию» на диск, чтобы предотвратить потерю данных при использовании слишком большого количества памяти (и, возможно, сбой)?Мы вызываем нашу функцию сохранения после
Как мы уже узнали:
Мы НЕ использовали:
func applicationWillResignActive(_ application: UIApplication) {
print("applicationWillResignActive")
}
для сохранения контекста, может ли это быть проблемой (мыуже сохраняют контекст после каждого создаваемого объекта?И хорошо ли, возможно, вылетать в приложение, чтобы предотвратить борьбу пользователя с потерей данных?
Редактировать: это используемый Core Data Handler:
import Foundation
import CoreData
let context = CoreDataManager.shared.managedObjectContext
func saveContext(_ completion: (() -> Void)? = nil) {
CoreDataManager.shared.save(completion)
}
func saveContextSync() {
CoreDataManager.shared.saveSync()
}
class CoreDataManager: NSObject {
static let shared = CoreDataManager()
lazy var managedObjectContext: NSManagedObjectContext = {
var managedObjectContext = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)
managedObjectContext.persistentStoreCoordinator = persistentStoreCoordinator
return managedObjectContext
}()
И наша функция сохранения:
@objc func save(_ completion: (() -> Void)?) {
saveAsync(completion)
}
func saveAsync(_ completion: (() -> Void)?) {
func save() {
context.perform {
do { try context.save() }
catch {
// HERE WE NEED TO HANDLE IT FOR A PRODUCTIVE ENVIRONMENT
}
completion?()
}
}
if Thread.isMainThread {
save()
} else {
DispatchQueue.main.async {
save()
}
}
}
func saveSync() {
func save() {
context.performAndWait {
do { try context.save() }
catch { print(error)
// TRY TO REPRODUCE MEMORY LOSS APP TO SEE WHAT HAPPENS
abort()
}
}
}
if Thread.isMainThread {
save()
} else {
DispatchQueue.main.sync {
save()
}
}
}
Редактировать 2: Этот вопрос в Задаче C должен быть очень похож:
Основные данные возвращаются к предыдущему состоянию без видимой причины
Редактировать 3: Кажется, что нет сбоя, некоторые пользователи говорят мне, что они добавляют данные, затем просто нажмите кнопку «Домой», и через пару часов данные из последней «задачи» будут потеряны.