태그 보관물: multithreading

multithreading

CoreData : 경고 : 명명 된 클래스를로드 할 수 없습니다. 방식을 사용하여 백그라운드 스레딩을

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

4 개의 엔티티 모델을 만들고 NSManagedObject 하위 클래스 (Swift에서)를 만들었으며 모든 파일에는 적절한 앱 대상이 설정되어 있습니다 ( ‘Compile Sources’).

새 엔티티를 삽입하려고 할 때마다이 오류가 계속 발생합니다.

CoreData : 경고 : 엔티티 ‘Shows’에 대해 ‘Shows’라는 클래스를로드 할 수 없습니다. 클래스를 찾을 수 없습니다. 대신 기본 NSManagedObject를 사용합니다.

몇 가지 의견 :

Core Data에 저장할 때 부모-자식 컨텍스트 방식을 사용하여 백그라운드 스레딩을 허용합니다. 다음을 사용하여 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...
})


답변

이 경고는 Swift 구현의 세부 사항을 해결하는 동안 처리해야하는 단점 중 하나입니다. 경고는 허위로 발생합니다. 즉, 아래에 설명 된 단계를 따르지 않아도 설정이 작동 할 수 있습니다.

모델 편집기에서 클래스가 올바르게 설정되었는지 확인 하여 대부분의 경우 제거 할 수있었습니다 . 다른 많은 SOF 게시물 (이 질문에 대한 답변 포함)과 달리 모듈 이름 (예 :)을 포함하라는 제안이 도움 MyApp.Shows되지 않았습니다 .

다음 세 가지 항목을 확인하십시오.

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

귀하의 엔티티 이름을 더 적절한 단수로 수정했습니다.

Xcode 7.1의 Swift 2.0에서 작동하는 버전
(Xcode 7 베타 4 이상에서 작동해야 함)

모듈에서 “현재 제품 모듈”텍스트를 삭제해야합니다!

2.
또한 빈번한 권장 사항을 따라야합니다.

@objc(Show)

수업 바로 위에.

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

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

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

답변

SWIFT 2 / XCODE 7 업데이트 :

이 문제 (이 답변에 대한 4 월 3 일 주석 참조)는 Apple의 Swift 2XCode 7 베타 릴리스 에서 해결 되었습니다 . 따라서 실제로 Mundi가 응답하거나 클래스 이름 앞에 ” “를 사용하는 Swift 에서는 필요하지 않습니다 . 작동이 중지됩니다. 그래서 이것을 제거 하고 파일 에 이름을 입력 하고 모듈로 선택
하고 응원하십시오!@objc(myEntity)MyAppName.ClassCurrent Working Module

그러나 사용하는 사람들을 위해 @objc(myEntity) (나와 같은) Swift에서 원활하게 작동하는 다른 솔루션을 대신 사용할 수 있습니다.

xcdatamodel에서 올바른 클래스입니다. 다음과 같이 표시되어야합니다.

여기 있습니다. Module.ClassSwift 및 XCode 6의 CoreData 패턴입니다 . Model Policy 또는 기타 CoreData 항목에서 Custom Policy 클래스를 사용할 때도 동일한 절차가 필요합니다 . 참고 : 이미지에서 이름과 클래스는 Car 및 MyAppName.Car (또는 엔터티의 이름) 여야합니다. 여기에 User오타가 있습니다.


답변

Xcode 7과 순전히 Swift를 사용할 때 실제로 자동 생성 된 하위 클래스 ( > 에서 생성됨)에서 제거 해야했습니다 .@objc(MyClass)NSManagedObjectEditorCreate NSManagedObject Subclass...


답변

Xcode 7 베타 2 (그리고 나는 1을 믿습니다)에서 모델 구성에서 새로운 관리 객체 유형 File이 모듈로 설정 되고 객체의 Current Product Module클래스가 구성에 .File.

모듈 설정을 삭제하여 공백으로 만들거나 전체 중지를 제거하여 구성의 클래스 이름이 그대로 유지 File되도록하는 것은 각각 다른 변경을 유발하므로 동일한 작업입니다. 이 구성을 저장하면 설명 된 오류가 제거됩니다.


답변

Xcode 6.1.1에서는 기본 엔티티가 objc 클래스 (NSManagedObject)의 하위 집합이므로 @objc 속성을 추가 할 필요가 없습니다 ( Swift Type Compatibility 참조 . CoreData에서는 전체 Module.Class 이름이 필요합니다. Module을 알고 있어야합니다. name은 빌드 설정-> 패키징-> 제품 모듈 이름에 설정되어 있습니다. 기본적으로이 값은 대상의 이름 이 될 $ (PRODUCT_NAME : c99extidentifier)로 설정됩니다 .


답변

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

이름- “귀하의 법인 이름”

클래스- “엔티티 이름”

모듈- “현재 제품 모듈”

Entity 클래스 파일의 코드는 다음과 같습니다 (내 코드에서 Entity는 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로 이동하여 모듈 이름으로 바꿔야 합니다. 그렇지 않으면 class not found영구 저장소 코디네이터를 만들 때 오류가 발생합니다.