Ios 已将无法识别的CoreData选择器发送到实例

Ios 已将无法识别的CoreData选择器发送到实例,ios,swift,core-data,swiftui,Ios,Swift,Core Data,Swiftui,我正在尝试将CoreData添加到我的应用程序中。该应用程序将是一个照片应用程序,并允许用户在相册中存储照片。我目前在CoreData中有两个实体,Photo和Album 相册实体有四个属性albumCoverImageData:二进制数据,id:UUID,名称:字符串,密码保护:布尔值。除了这些属性之外,它还有一个关系photosdestinationPhotoInverseAlbum Photo实体有两个属性,id:UUID和imageData:BinaryData 尝试向数据库添加新相册时

我正在尝试将CoreData添加到我的应用程序中。该应用程序将是一个照片应用程序,并允许用户在相册中存储照片。我目前在CoreData中有两个实体,
Photo
Album

相册实体有四个属性<代码>albumCoverImageData:二进制数据,
id:UUID
名称:字符串
密码保护:布尔值
。除了这些属性之外,它还有一个关系
photos
destination
Photo
Inverse
Album

Photo
实体有两个属性,
id:UUID
imageData:BinaryData

尝试向数据库添加新相册时,在尝试保存上下文时,应用程序会崩溃,并出现以下错误

2020-10-20 15:49:33.889808-0400 LockIt[902:92475] -[__NSConcreteUUID compare:]: unrecognized selector sent to instance 0x2817b4fe0

2020-10-20 15:53:28.604954-0400 LockIt[902:92475] [error] error: Serious application error.  Exception was caught during Core Data change processing.  This is usually a bug within an observer of NSManagedObjectContextObjectsDidChangeNotification.  -[__NSConcreteUUID compare:]: unrecognized selector sent to instance 0x2817b4fe0 with userInfo (null)

CoreData: error: Serious application error.  Exception was caught during Core Data change processing.  This is usually a bug within an observer of NSManagedObjectContextObjectsDidChangeNotification.  -[__NSConcreteUUID compare:]: unrecognized selector sent to instance 0x2817b4fe0 with userInfo (null)

2020-10-20 15:53:28.622315-0400 LockIt[902:92475] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSConcreteUUID compare:]: unrecognized selector sent to instance 0x2817b4fe0'

*** First throw call stack:

(0x1937c65ac 0x1a78b442c 0x1936d0a2c 0x1937c9130 0x1937cb420 0x194b18c90 0x1998e5dc8 0x1998e58a0 0x1998e6ad0 0x1998e77b4 0x19989a410 0x199767b64 0x1998e7100 0x193725764 0x193725718 0x193724cd4 0x1937246a0 0x1949bc5f4 0x199892118 0x1998a0c50 0x199892fc0 0x199761aa0 0x104503bd8 0x104502e68 0x104502854 0x199fd2c04 0x19a2c3ec0 0x19a049990 0x19a0499b8 0x19a049990 0x19a03a1dc 0x19a088444 0x19a4d8f58 0x19a4d71a4 0x19a4d7d78 0x195c4d334 0x196177a4c 0x195c43350 0x195c43030 0x19612ef80 0x196108bc0 0x196190118 0x196193070 0x19618a5f4 0x19374381c 0x193743718 0x193742a28 0x19373cd20 0x19373c4bc 0x1aa24e820 0x1960e9164 0x1960ee840 0x1044f2178 0x193403e40)

libc++abi.dylib: terminating with uncaught exception of type NSException

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSConcreteUUID compare:]: unrecognized selector sent to instance 0x2817b4fe0'

terminating with uncaught exception of type NSException

我在下面附上了相关文件。 照片+CoreDataProperties

import Foundation

import CoreData





extension Photo {



    @nonobjc public class func fetchRequest() -> NSFetchRequest<Photo> {

        return NSFetchRequest<Photo>(entityName: "Photo")

    }



    @NSManaged public var id: UUID?

    @NSManaged public var imageData: Data?

    @NSManaged public var album: Album?



}



extension Photo : Identifiable {



    public var wrappedID: UUID {

        id!

    }

    

    public var wrappedImageData: Data {

        imageData!

    }

}
import Foundation

import CoreData





extension Album {



    @nonobjc public class func fetchRequest() -> NSFetchRequest<Album> {

        return NSFetchRequest<Album>(entityName: "Album")

    }



    @NSManaged public var albumCoverImageData: Data?

    @NSManaged public var id: UUID?

    @NSManaged public var name: String?

    @NSManaged public var passwordProtected: Bool

    @NSManaged public var photos: NSSet?

    

    public var wrappedID: UUID {

        id!

    }

    

    public var wrappedAlbumCoverImageData: Data {

        albumCoverImageData!

    }

    

    public var wrappedName: String {

        name ?? "Unamed Album"

    }

    

    public var wrappedPasswordProtected: Bool {

        passwordProtected

    }

    

    public var photoArray: [Photo] {

        let set = photos as? Set<Photo> ?? []

        

        return Array(set)

    }



}



// MARK: Generated accessors for photos

extension Album {



    @objc(addPhotosObject:)

    @NSManaged public func addToPhotos(_ value: Photo)



    @objc(removePhotosObject:)

    @NSManaged public func removeFromPhotos(_ value: Photo)



    @objc(addPhotos:)

    @NSManaged public func addToPhotos(_ values: NSSet)



    @objc(removePhotos:)

    @NSManaged public func removeFromPhotos(_ values: NSSet)



}



extension Album : Identifiable {

    

}
<代码>导入基础 导入CoreData 分机照片{ @nonobjc公共类func fetchRequest()->NSFetchRequest{ 返回NSFetchRequest(entityName:“照片”)     } @NSManaged公共变量id:UUID? @NSManaged public var imageData:数据? @NSManaged public var相册:相册? } 分机照片:可识别{ 公共变量:UUID{ 身份证!     }      公共变量wrappedImageData:数据{ 图像数据!     } } Album+CoreDataProperties

import Foundation

import CoreData





extension Photo {



    @nonobjc public class func fetchRequest() -> NSFetchRequest<Photo> {

        return NSFetchRequest<Photo>(entityName: "Photo")

    }



    @NSManaged public var id: UUID?

    @NSManaged public var imageData: Data?

    @NSManaged public var album: Album?



}



extension Photo : Identifiable {



    public var wrappedID: UUID {

        id!

    }

    

    public var wrappedImageData: Data {

        imageData!

    }

}
import Foundation

import CoreData





extension Album {



    @nonobjc public class func fetchRequest() -> NSFetchRequest<Album> {

        return NSFetchRequest<Album>(entityName: "Album")

    }



    @NSManaged public var albumCoverImageData: Data?

    @NSManaged public var id: UUID?

    @NSManaged public var name: String?

    @NSManaged public var passwordProtected: Bool

    @NSManaged public var photos: NSSet?

    

    public var wrappedID: UUID {

        id!

    }

    

    public var wrappedAlbumCoverImageData: Data {

        albumCoverImageData!

    }

    

    public var wrappedName: String {

        name ?? "Unamed Album"

    }

    

    public var wrappedPasswordProtected: Bool {

        passwordProtected

    }

    

    public var photoArray: [Photo] {

        let set = photos as? Set<Photo> ?? []

        

        return Array(set)

    }



}



// MARK: Generated accessors for photos

extension Album {



    @objc(addPhotosObject:)

    @NSManaged public func addToPhotos(_ value: Photo)



    @objc(removePhotosObject:)

    @NSManaged public func removeFromPhotos(_ value: Photo)



    @objc(addPhotos:)

    @NSManaged public func addToPhotos(_ values: NSSet)



    @objc(removePhotos:)

    @NSManaged public func removeFromPhotos(_ values: NSSet)



}



extension Album : Identifiable {

    

}
<代码>导入基础 导入CoreData 扩展相册{ @nonobjc公共类func fetchRequest()->NSFetchRequest{ 返回NSFetchRequest(entityName:“相册”)     } @NSManaged public var coverImageData:数据? @NSManaged公共变量id:UUID? @NSManaged public var name:String? @NSManaged public var passwordProtected:Bool @NSManaged public-var照片:NSSet?      公共变量:UUID{ 身份证!     }      公共变量wrappedAlbumCoverImageData:数据{ albumCoverImageData!     }      公共变量wrappedName:字符串{ 名称??“未编辑的相册”     }      公共变量wrappedPasswordProtected:Bool{ 密码保护     }      公共var光阵列:[照片]{ 设置=照片为?设置???[]          返回数组(集合)     } } //标记:为照片生成的访问者 扩展相册{ @objc(addPhotosObject:) @NSManaged public func addToPhotos(uu值:照片) @objc(removePhotosObject:) @NSManaged public func removeFromPhotos(u值:Photo) @objc(addPhotos:) @NSManaged public func addToPhotos(u值:NSSet) @objc(移除照片:) @NSManaged public func removeFromPhotos(u值:NSSet) } 扩展相册:可识别{      } 主视图

import SwiftUI



struct AlbumCollectionView: View {

    @Environment(\.managedObjectContext) var managedObjectContext

    @FetchRequest(entity: Photo.entity(),

                  sortDescriptors: [

                    NSSortDescriptor(keyPath: \Photo.id, ascending: true)

                  ]

    ) var photos: FetchedResults<Photo>

    

    @FetchRequest(entity: Album.entity(),

                  sortDescriptors: [

                    NSSortDescriptor(keyPath: \Album.name, ascending: true)

                  ]

    ) var albums: FetchedResults<Album>

    

    @State private var showingImagePicker = false

    @State private var showingPopover = false

    @State private var inputImage: UIImage?

    @State private var albumNameInput: String = ""

    

    let columns = [

        GridItem(.adaptive(minimum: 150))

    ]

    

    var body: some View {

        ScrollView {

            LazyVGrid(columns: columns, spacing: 20) {

                ForEach(albums) { album in

                    NavigationLink(destination: AlbumView(album: album)) {

                        VStack {

                            Image(data: album.albumCoverImageData, placeholder: "No Image")

                                .resizable()

                                .aspectRatio(1, contentMode: .fill)

                                .contextMenu(menuItems: {

                                    Button(action: {

                                        deleteAlbum(selectedAlbum: album)

                                    }) {

                                        Label("Remove", systemImage: "trash")

                                    }

                                })

                            Text(album.name ?? "")

                        }

                    }

                }

            }

            .padding()

            .navigationBarTitle(Text("Albums"))

            .navigationBarItems(trailing:

                Menu {

                    Button(action: {

                        self.showingPopover = true

                    }) {

                        Label("Add Album", systemImage: "photo.on.rectangle.angled")

                    }

                    Button(action: {

                        self.showingImagePicker = true

                    }) {

                        Label("Add Photo", systemImage: "photo")

                    }

                } label: {

                    Image(systemName: "plus")

                        .popover(isPresented: $showingPopover, arrowEdge: .trailing ,content: {

                            VStack {

                                Text("New Album")

                                TextField("Enter Album Name",text: $albumNameInput)

                                    .textFieldStyle(RoundedBorderTextFieldStyle())

                                Button("Submit"){

                                    addAlbum(name: albumNameInput, albumCover: UIImage(named: "Image 1")!)

                                    albumNameInput = ""

                                    showingPopover = false

                                }

                            }

                            .padding()

                        })

                }

            )

            .sheet(isPresented: $showingImagePicker, onDismiss: loadImage) {

                ImagePicker(image: self.$inputImage)

            }

        }

    }

    

    func addAlbum(name: String, albumCover: UIImage) {

        let newAlbum = Album(context: managedObjectContext)

        

        newAlbum.id = UUID()

        newAlbum.name = name

        newAlbum.passwordProtected = false

        newAlbum.albumCoverImageData = albumCover.jpegData(compressionQuality: 1.0)

        

        saveContext()

    }

    

    func deleteAlbum(selectedAlbum: Album) {

        for album in albums {

            if selectedAlbum == album {

                self.managedObjectContext.delete(album)

            }

        }

        saveContext()

    }

    

    func loadImage() {

        guard let inputImage = inputImage else { return }

        addPhoto(image: inputImage)

    }

    

    func addPhoto(image: UIImage) {

        let newPhoto = Photo(context: managedObjectContext)

        

        newPhoto.id = UUID()

        newPhoto.imageData = image.jpegData(compressionQuality: 1.0)

        

        saveContext()

    }

    

    func saveContext() {

        do {

            try managedObjectContext.save()

        } catch {

            print("Error saving managed object context: \(error)")

        }

    }

}
导入快捷界面
结构AlbumCollectionView:视图{
@Environment(\.managedObjectContext)var managedObjectContext
@FetchRequest(实体:Photo.entity(),
sortDescriptors:[
NSSortDescriptor(密钥路径:\Photo.id,升序:true)
                  ]
)var照片:获取结果
    
@FetchRequest(实体:Album.entity(),
sortDescriptors:[
NSSortDescriptor(键路径:\Album.name,升序:true)
                  ]
)var相册:获取结果
    
@State private var showingImagePicker=false
@State private var showingPopover=false
@State private var inputImage:UIImage?
@State private var albumNameInput:String=“”
    
让列=[
GridItem(.adaptive(最小值:150))
    ]
    
var body:一些观点{
滚动视图{
LazyVGrid(列:列,间距:20){
ForEach(相册){相册在
导航链接(目标:相册视图(相册:相册)){
VStack{
图像(数据:album.albumCoverImageData,占位符:“无图像”)
.可调整大小()
.aspectRatio(1,contentMode:.fill)
.contextMenu(菜单项:{
按钮(操作:{
删除相册(已选相册:相册)
                                    }) {
标签(“删除”,系统图像:“垃圾”)
                                    }
                                })
文本(album.name???)
                        }
                    }
                }
            }
.padding()
.navigationBarTitle(文本(“相册”))
.navigationBarItems(尾部:
菜单{
按钮(操作:{
self.showingPopover=true
                    }) {
标签(“添加相册”,系统图像:“photo.on.rectangle.angled”)
                    }
按钮(操作:{
self.showingImagePicker=true
                    }) {
标签(“添加照片”,系统图像:“照片”)
                    }
}标签:{
图像(系统名称:“plus”)
.popover(显示:$showingPopover,arrowEdge:.尾随,内容:{
VStack{