programing

핵심 데이터: 경고:명명된 클래스를 로드할 수 없습니다.

stoneblock 2023. 10. 26. 20:36

핵심 데이터: 경고:명명된 클래스를 로드할 수 없습니다.

기존 Objective-C TV Show 앱을 Xcode 6.1을 사용하는 새로운 Swift 버전에 복제하고 있으며 CoreData에 문제가 있습니다.

4개의 엔티티 모델을 만들고 NSManagedObject 서브클래스(Swift)를 만들었고 모든 파일에 적절한 앱 대상이 설정되어 있습니다('Compile Sources'의 경우).

새 엔티티를 삽입할 때마다 다음 오류가 발생합니다.

핵심 데이터: 경고:엔티티 'Shows'에 대해 'Shows'라는 이름의 클래스를 로드할 수 없습니다.클래스를 찾을 수 없으며 대신 기본 NSManagedObject를 사용합니다.

몇 가지 의견:

핵심 데이터에 저장할 때 부모 자식 컨텍스트 방식을 사용하여 백그라운드 스레드를 허용합니다.다음을 사용하여 ManagedObjectContext를 설정합니다.

lazy var managedObjectContext: NSManagedObjectContext? = {
  // Returns the managed object context for the application (which is already bound to the persistent store coordinator for the application.) This property is optional since there are legitimate error conditions that could cause the creation of the context to fail.
  let coordinator = self.persistentStoreCoordinator
  if coordinator == nil {
    return nil
  }
  var managedObjectContext = NSManagedObjectContext(concurrencyType: NSManagedObjectContextConcurrencyType.MainQueueConcurrencyType)
  managedObjectContext.persistentStoreCoordinator = coordinator
  return managedObjectContext
}()

다음을 사용하여 데이터를 저장할 수 있습니다.

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), { () -> Void in
  var context = NSManagedObjectContext(concurrencyType: NSManagedObjectContextConcurrencyType.PrivateQueueConcurrencyType)
  context.parentContext = self.managedObjectContext!
  ...rest of core data saving code here...
})

이 경고는 스위프트 구현의 세부 사항이 조정되는 동안 우리가 처리해야 할 특이 사항 중 하나입니다.경고가 발생합니다. 즉, 아래에 설명된 단계를 따르지 않더라도 설정이 작동할 수 있습니다.

는 모델 에디터에서 클래스가 올바르게 설정되어 있는지 확인함으로써 대부분의 경우 그것을 없앨 수 있었습니다.다른 많은 SOF 게시물(이 질문에 대한 답변 포함)과 달리 모듈 이름을 포함하는 것이 좋습니다(예:MyApp.Shows도움이 되지 않았습니다.

다음 세 가지 항목을 확인해야 합니다.

1.
Xcode 7 베타 3까지 작동하는 버전

Up to XCode7 b3

제가 당신의 엔터티 이름을 더 적절한 단수로 수정했음을 주목해 주십시오.

1Xcode 7.1 에서 Swift 2.에서
7 4 (Xcode 7타 4함)

모듈에서 "현재 상품 모듈" 텍스트를 삭제하셔야 합니다!

From Xcode7 beta 3

2.
또한 다음을 포함하도록 자주 권장하는 사항을 따라야 합니다.

@objc(Show)

당신 반 바로 위에요.

참고: Xcode 7 베타 4 이상을 사용하는 경우 이 단계는 선택 사항입니다.

3.
또한 생성된 관리 개체를 적절한 클래스로 캐스트해야 합니다. 기본값은 다음과 같습니다.NSManagedObject.

var newShow = NSEntityDescription.insertNewObjectForEntityForName("Show", 
                 inManagedObjectContext: context) as Show

SWIFT 2 / XCODE 7 업데이트:

문제는 Apple의 Swift 2XCode 7 베타 릴리스에서 해결되었습니다.그래서 이제 당신은 사실 필요가 없습니다.@objc(myEntity)먼디가 대답한 스위프트에서 "MyAppName. 앞에서 당신의 반 이름 앞에.작동이 중단됩니다.그러니까 이걸 빼고 그냥 집어넣어요.Class파일에 이름을 지정하고 선택합니다.Current Working Module모듈과 환호로써!

Selecting current working module

하지만 사용하시는 분들은@objc(myEntity)스위프트(나와 같은)에서는 원활하게 작동하는 이 다른 솔루션을 대신 사용할 수 있습니다.

xcdata 모델에서 올바른 클래스 인.다음과 같이 보여야 합니다.

Setting the class

여기 있어요.Module.Class 는 Swift 및 XCode 6의 CoreData 패턴입니다.모델 정책 또는 기타 핵심 데이터 항목에서 사용자 지정 정책 클래스를 사용할 때도 동일한 절차가 필요합니다.참고 사항: 이미지에서 The Name and Class는 Car and MyAppName이어야 합니다.자동차(또는 당신의 실체의 이름이 무엇이든). 여기 오타가 있습니다.

Xcode 7과 순수하게 Swift를 사용할 때, 사실은 제거해야 했습니다. @objc(MyClass)나의 오토제너레이션으로NSManagedObjectsubclass ( > 에서 생성됨).

Xcode 7 베타 2(그리고 I believe 1)에서 모델 구성에서 새로운 관리 개체 유형의File모듈로 설정됩니다.Current Product Module객체의 클래스는 다음과 같이 구성되어 있습니다..File.

Module of managed object type set to "Current Product Module" in Xcode 7

모듈 설정이 공백이 되도록 삭제하거나, 구성의 클래스 이름이 단순하도록 전체 중지를 삭제합니다.File각각이 다른 변화를 야기하기 때문에 동등한 동작입니다.이 구성을 저장하면 설명된 오류가 제거됩니다.

Module of managed object set to be blank in Xcode 7

Xcode 6.1.1에서는 기본 엔티티가 objc 클래스(NSManagedObject)의 하위 집합이므로 @objc 특성을 추가할 필요가 없습니다(Swift Type Compatibility 참조).CoreData에서 전체 모듈.클래스 이름이 필요합니다.Module name은 Build Settings -> Packaging -> Product Module Name에 설정되어 있습니다.기본적으로 대상 이름이 될 $(PRODUCT_NAME:c99 extidentifier)로 설정됩니다.

xCode 7 및 Swift 2.0 버전에서는 @objc(NameOfClass)를 추가할 필요 없이 아래와 같이 "Show the Data Model Inspector" 탭에서 엔터티 설정을 변경하면 됩니다 -

이름 - "엔터티 이름"

클래스 - "엔터티 이름"

모듈 - "현재 제품 모듈"

enter image description here

Entity 클래스 파일의 코드는 (내 코드 Entity is Family에서)와 같습니다.

import UIKit
import CoreData

class Family: NSManagedObject {

   @NSManaged var member : AnyObject
}

이 예제는 xCode 7.0 + swift 2.0으로 내 앱에서 잘 작동합니다.

교체하는 것을 잊지 마십시오.PRODUCT_MODULE_NAME당신의 제품 모듈 이름과 함께.

새 도면요소가 생성되면 Data Model Inspector(마지막 탭)로 이동하여 교체해야 합니다.PRODUCT_MODULE_NAME당신의 모듈 이름과 함께, 그렇지 않으면 결과적으로 a.class not found영구 저장소 코디네이터를 만들 때 오류가 발생했습니다.

(적어도 Xcode 6.3.2와 함께) Module을 사용해야 합니다.예를 들어 캐스트를 수행할 때 클래스:모듈(즉, 제품명)이 식품이고 클래스가 과일이라고 가정합니다.

let myEntity =  NSEntityDescription.entityForName("Fruit", inManagedObjectContext: managedContext)

let fruit = NSManagedObject(entity: myEntity!, insertIntoManagedObjectContext:managedContext) as! Food.Fruit

요약:

  • Data Model Editor(데이터 모델 편집기)에서 엔터티를 정의할 때 모듈 이름 포함(이름:과일, 클래스: 식품.과일)
  • 코드에 있는 엔티티에 액세스할 때(즉,).SWIFT), Module. class(예: Food)와 함께 주조합니다.과일)

저도 비슷한 문제가 발생했습니다. 다음 단계에 따라 해결하십시오.

  1. 상위 개체가 NSManagedObject이지 NSObject가 아닙니다.
  2. 엔티티의 모듈이 "현재 제품 모듈"이 아닌 기본 모듈입니다.

데이터 모델 편집기에서 엔터티 클래스 이름을 문제의 클래스에 대응하도록 변경하고 추가@objc(NameOfClass)각 NSManagedObject의 파일을 클래스 선언 바로 위에 저장하기 위해 Unit Testing 중에 이 문제를 해결했습니다.

이러한 답변의 대부분은 여전히 Xcode 14에 적용되는 것으로 보입니다.그러나 Swift NSManagedObject 하위 클래스는 사용자 지정 프레임워크에 포함됩니다.그래서 제게 도움이 된 것은해당 엔티티 검사기의 해당 모듈 필드(Khunsan 답변의 스크린샷 참조)에 MyFramework와 같은 프레임워크의 이름을 입력합니다.

저에게 효과가 있었던 것은 (Xcode 7.4, Swift) 클래스 이름을 다음으로 바꾸는 것입니다.<my actual class name>.<entity name>Entity inspector에서 'Class' 상자를 선택합니다.

Managed Object 하위 클래스의 이니시에이터는 다음과 같습니다.

    convenience init(<properties to init>) {
    let entityDescr = NSEntityDescription.entityForName("<entity class name>", inManagedObjectContext: <managed context>)
    self.init(entity: entityDescr!, insertIntoManagedObjectContext: <managed context>)}
    //init properties here

Xcode 11.5의 경우: Codegen 속성이 class Definition이고 xcdata 모델에서 생성한 엔티티에 대한 제안을 받지 못하는 경우.Xcode를 종료하고 프로젝트를 다시 시작해 보십시오.저한테는 효과가 있어요.이 답변은 제안이 없는 경우에만 해당되며 파일이 생성되지 않는 경우 위의 답변을 시도해 보십시오.

언급URL : https://stackoverflow.com/questions/26613971/coredata-warning-unable-to-load-class-named