Je rencontre ce problème de performance énorme tout en enregistrant NSAttrbutedString avec des images dans Core Data.Ajouter des images dans NSAttributedString et enregistrer dans Core Data performance
Il y a un UITextView où permet à l'utilisateur de saisir du texte, ainsi que l'ajout d'images. Lorsque l'utilisateur a fini de taper et de cliquer sur le bouton 'done', il sera enregistré dans CoreData et affiché dans un TableView.
Voici comment j'enregistrer le contenu lorsque cliquez sur « fait » le bouton:
Créer un MOC privé et affecter le AppDelegates managedObjectContext comme MOC mère.
privateMOC = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType)
privateMOC.parent = managedObjectContext
privateMOC.perform {
do {
try self.privateMOC.save()
self.managedObjectContext.performAndWait {
do {
try self.managedObjectContext.save()
} catch {
fatalError("Failure to save context: \(error)")
}
}
} catch {
print("Could not save \(error)")
}
}
Il y a deux questions:
Dépend sur les images, quand je cliquez sur le bouton « Terminé », l'interface utilisateur est bloqué et prend 3 - 5 secondes avant le point de vue rejeté et indiqué dans le TableView.
Je vérifie la base de données réelle .sqlite et trouvé, une seule nouvelle entrée ajoutée (texte et images en UITextView) Diminue la taille de la base de données augmente presque 12MB! (Peut-être que les images prennent trop de place?)
Des suggestions pour résoudre ces problèmes? Merci!
Merci beaucoup pour l'explication détaillée! Tu as raison! La taille de l'image est énorme (~ 13 Mo) sans aucune compression. Et j'essayais de sauver l'image brute. origine largeur de l'image: 2448.0 origine image hauteur: 3264.0 Origine Taille de l'image en bytes: 13532006 (~ ** 13MB **!) après compression largeur de l'image: En option (750.0) après compression hauteur de l'image: Optionnel (1000.0) après compression Taille en octets: 908975 (** ~ 900kb **) Après la compression, c'est beaucoup plus rapide. Cependant, il bloque toujours l'interface utilisateur tout en sauvegardant le contexte. Comment pourrais-je l'enregistrer en arrière-plan sans bloquer mon interface utilisateur? – artekr
Je pensais qu'avec un attribut de base de données binaire au lieu de transformable, vous deviez appeler vous-même les méthodes 'NSCoding'. Vous pouvez le faire avant de tenter d'enregistrer les modifications dans une file d'attente d'arrière-plan. Vous utiliseriez probablement 'NSKeyedArchiver' pour encoder et' NSKeyedUnarchiver' pour décoder. –
Merci! La chose est le contenu est transformable, et je n'ai pas la possibilité de le changer en binaire. Parce que sinon je vais devoir faire une migration de base de données pour convertir tout le contenu précédent en binaire (j'ai fait une migration avant et c'était tellement pénible, et beaucoup d'utilisateurs ont même perdu leurs données :(). – artekr