Swift 将图像加载到核心数据中的相册时出现问题
我在核心数据中设置了一对多关系 相册可以保存许多图像 每次我创建新相册时,都会加载相同的图像。我希望用户能够将不同的照片保存到每个相册中 我想当我试图加载数据时,问题可能出在谓词上,但我不能完全确定。我很抱歉发布了所有这些可能不相关的代码,但我想发布所有代码,以防有一些我看不到的东西可能被其他人捕获 我还想补充一点,当我为NSPredicate添加代码时,当我单击A album单元格时,集合视图中不会显示图像,但当我在loadData()中注释掉谓词的代码时,图像会显示出来。我不知道这是为什么Swift 将图像加载到核心数据中的相册时出现问题,swift,xcode,core-data,nspredicate,Swift,Xcode,Core Data,Nspredicate,我在核心数据中设置了一对多关系 相册可以保存许多图像 每次我创建新相册时,都会加载相同的图像。我希望用户能够将不同的照片保存到每个相册中 我想当我试图加载数据时,问题可能出在谓词上,但我不能完全确定。我很抱歉发布了所有这些可能不相关的代码,但我想发布所有代码,以防有一些我看不到的东西可能被其他人捕获 我还想补充一点,当我为NSPredicate添加代码时,当我单击A album单元格时,集合视图中不会显示图像,但当我在loadData()中注释掉谓词的代码时,图像会显示出来。我不知道这是为什么
class ViewController: UIViewController {
var fetchedResultsController: NSFetchedResultsController<PhotoAlbum>!
var contextApp = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
var moc:NSManagedObjectContext! = nil
@IBOutlet weak var tableView: UITableView!
func setupFetchedResultsController() {
let fetchRequest:NSFetchRequest<PhotoAlbum> = PhotoAlbum.fetchRequest()
let sortDescriptor = NSSortDescriptor(key: "album", ascending: true)
fetchRequest.sortDescriptors = [sortDescriptor]
fetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: contextApp, sectionNameKeyPath: nil, cacheName: nil)
fetchedResultsController.delegate = self
do {
try fetchedResultsController.performFetch()
}catch {
print(error)
}
}
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
tableView.delegate = self
tableView.dataSource = self
setupFetchedResultsController()
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
setupFetchedResultsController()
}
@IBAction func createNewAlbum(_ sender: UIBarButtonItem) {
presentnewAlbumAlert()
}
func presentnewAlbumAlert () {
let alert = UIAlertController(title: "New Album", message: "Enter a name for this album", preferredStyle: .alert)
// Create actions
let cancelAction = UIAlertAction(title: "Cancel", style: .cancel, handler: nil)
let saveAction = UIAlertAction(title: "Save", style: .default) { [weak self] action in
if let name = alert.textFields?.first?.text {
self?.addAlbumCell(name: name)
}
}
saveAction.isEnabled = false
// Add a text field
alert.addTextField { textField in
textField.placeholder = "Name"
NotificationCenter.default.addObserver(forName: UITextField.textDidChangeNotification, object: textField, queue: .main) { notif in
if let text = textField.text, !text.isEmpty {
saveAction.isEnabled = true
} else {
saveAction.isEnabled = false
}
}
}
alert.addAction(cancelAction)
alert.addAction(saveAction)
present(alert, animated: true, completion: nil)
}
func addAlbumCell(name: String) {
let album = PhotoAlbum(context: contextApp)
album.album = name
do {
try contextApp.save()
}catch{
print(error)
}
}
func deleteNote(at indexPath: IndexPath) {
let albumToDelete = fetchedResultsController.object(at: indexPath)
contextApp.delete(albumToDelete)
try? contextApp.save()
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "toCollection" {
if let indexPath = tableView.indexPathForSelectedRow {
let object = fetchedResultsController.object(at: indexPath)
(segue.destination as! PhotoViewController).album = object
}
}
}
}
//马克:德尔盖特
extension ViewController : UITableViewDelegate {
func numberOfSections(in tableView: UITableView) -> Int {
return fetchedResultsController?.sections?.count ?? 1
}
}
//加载和保存图像
func loadData() {
let imageReqeust: NSFetchRequest<Images> = Images.fetchRequest()
let predicate = NSPredicate(format: "images.album == %@", album)
imageReqeust.predicate = predicate
// print(predicate.description)
do {
imageDataArray = try managedObjectContext.fetch(imageReqeust)
self.collectionView.reloadData()
}catch {
print("Could not load data from database \(error.localizedDescription)")
}
}
func createImageContext( with image: UIImage) {
let imageItem = Images(context: managedObjectContext!)
imageItem.images = NSData(data: image.jpegData(compressionQuality: 1.0)!) as Data
// imageItem.image = NSData(data: UIImageJPEGRepresentation(image, 0.3)!) as Data
do {
try self.managedObjectContext.save()
self.loadData()
}catch {
print("Could not save data \(error.localizedDescription)")
}
}
// ViewDidLoad
override func viewDidLoad() {
super.viewDidLoad()
collectionView.delegate = self
collectionView.dataSource = self
managedObjectContext = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
self.navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(addImage(_:)))
loadData()
// Do any additional setup after loading the view.
}
func loadData(){
让ImageRequest:NSFetchRequest=Images.fetchRequest()
let predicate=NSPredicate(格式:“images.album==%@”,album)
ImageRequest.predicate=谓词
//打印(谓词描述)
做{
imageDataArray=尝试managedObjectContext.fetch(ImageRequest)
self.collectionView.reloadData()
}抓住{
打印(“无法从数据库\(错误。localizedDescription)”加载数据)
}
}
func createImageContext(带图像:UIImage){
让imageItem=Images(上下文:managedObjectContext!)
imageItem.images=NSData(数据:image.jpegData(压缩质量:1.0)!)作为数据
//imageItem.image=NSData(数据:UIImageJPEG表示法(图像,0.3)!)作为数据
做{
请尝试self.managedObjectContext.save()
self.loadData()
}抓住{
打印(“无法保存数据\(错误。localizedDescription)”)
}
}
//ViewDidLoad
重写func viewDidLoad(){
super.viewDidLoad()
collectionView.delegate=self
collectionView.dataSource=self
managedObjectContext=(UIApplication.shared.delegate为!AppDelegate)。persistentContainer.viewContext
self.navigationItem.rightBarButtonItem=UIBarButtonItem(barButtonSystemItem:。添加,目标:self,操作:#选择器(添加图像(:))
loadData()
//加载视图后执行任何其他设置。
}
在第二个视图控制器中,您不需要从核心数据获取图像,而是可以通过相册属性访问它们
imageDataArray = Array(album.images)
保存新图像实例时,不要忘记将其分配到相册
imageItem.album = self.album
只是一张纸条。更好的方法是将图像存储在磁盘上(例如存储到文档中),并将路径保存到CoreData中。
func loadData() {
let imageReqeust: NSFetchRequest<Images> = Images.fetchRequest()
let predicate = NSPredicate(format: "images.album == %@", album)
imageReqeust.predicate = predicate
// print(predicate.description)
do {
imageDataArray = try managedObjectContext.fetch(imageReqeust)
self.collectionView.reloadData()
}catch {
print("Could not load data from database \(error.localizedDescription)")
}
}
func createImageContext( with image: UIImage) {
let imageItem = Images(context: managedObjectContext!)
imageItem.images = NSData(data: image.jpegData(compressionQuality: 1.0)!) as Data
// imageItem.image = NSData(data: UIImageJPEGRepresentation(image, 0.3)!) as Data
do {
try self.managedObjectContext.save()
self.loadData()
}catch {
print("Could not save data \(error.localizedDescription)")
}
}
// ViewDidLoad
override func viewDidLoad() {
super.viewDidLoad()
collectionView.delegate = self
collectionView.dataSource = self
managedObjectContext = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
self.navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(addImage(_:)))
loadData()
// Do any additional setup after loading the view.
}
imageDataArray = Array(album.images)
imageItem.album = self.album