Jim*_*med 91 multithreading core-data nsmanagedobject swift
我正在使用Xcode 6.1将现有的Objective-C电视节目应用程序复制到新的Swift版本,并且我在使用CoreData时遇到了一些问题.
我创建了一个包含4个实体的模型,创建了它们的NSManagedObject子类(在Swift中),并且所有文件都设置了适当的应用程序目标(用于"编译源代码").
每当我尝试插入一个新实体时,我仍然会收到此错误:
CoreData:警告:无法为实体"显示"加载名为"显示"的类.找不到类,而是使用默认的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
}()
Run Code Online (Sandbox Code Playgroud)
并使用以下方法保存数据:
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...
})
Run Code Online (Sandbox Code Playgroud)
Mun*_*ndi 171
这个警告是我们必须处理的一个怪癖,而Swift实现的细节正在被解决.该警告是虚假发生的,即即使您不遵循下面列出的步骤,您的设置也可能有效.
在大多数情况下,我已经能够通过确保在模型编辑器中正确设置类来摆脱它.与许多其他SOF帖子(包括此问题的答案)不同,包含模块名称(如MyApp.Shows)的建议对我没有帮助.
请务必检查以下三项:
1.
适用于Xcode 7 beta 3的版本

请注意,我将您的实体名称更正为更合适的单数.
适用于Xcode 7.1中的Swift 2.0的版本
(适用于Xcode 7 beta 4及更高版本)
您需要删除模块中的"当前产品模块"文本!

2.
您也应该遵循频繁的建议包括:
@objc(Show)
Run Code Online (Sandbox Code Playgroud)
就在你的班级之上.
注意:如果您使用的是Xcode 7 beta 4或更高版本,则此步骤是可选的.
3.
还要确保投所创建的管理对象到适当的类,作为默认的将只是NSManagedObject.
var newShow = NSEntityDescription.insertNewObjectForEntityForName("Show",
inManagedObjectContext: context) as Show
Run Code Online (Sandbox Code Playgroud)
khu*_*han 68
SWIFT 2/XCODE 7更新:
这个问题(请参阅我在4月3日对此答案的评论)在Apple的Swift 2和XCode 7测试版中得到了解决.所以你现在实际上并不需要在Swift中接受Mundi的回答或在你的Class名之前使用" ".它会停止工作.所以除去这些,只是把名义上的文件,并选择为模块 和欢呼声!
@objc(myEntity)MyAppName.ClassCurrent Working Module
但是对于那些@objc(myEntity)在Swift中使用的人(像我一样),你可以使用其他解决方案,而不是顺利运行.
在xcdatamodel正确的类中.它应该如下所示:

干得好.Module.Class是Swift和XCode 6中CoreData的模式.在模型策略或其他CoreData内容中使用自定义策略类时,您还需要相同的过程. 注意:在图像中,名称和类应为Car和MyAppName.Car(或您实体的任何名称).这User是一个错字.
San*_*aus 36
当使用Xcode 7和纯Swift时,我实际上必须从我自动生成的子类中删除 (从> 生成).@objc(MyClass)NSManagedObjectEditorCreate NSManagedObject Subclass...
Dun*_*age 12
在Xcode 7 beta 2中(我相信1),在模型配置中,将一个新的类型的托管对象File设置为Module Current Product Module,对象的类在配置中显示为.File.

删除模块设置使其为空白,或删除句点,以便配置中的类名只是File等效的操作,因为每个都会导致另一个更改.保存此配置将删除描述的错误.

小智 9
在Xcode 6.1.1中,您不需要添加@objc属性,因为基本实体是objc类(NSManagedObject)的子集(请参阅Swift类型兼容性.在CoreData中,需要完整的Module.Class名称.请注意模块name是Build Settings - > Packaging - > Product Module Name中设置的名称.默认设置为$(PRODUCT_NAME:c99extidentifier),它将是Target的名称.
使用xCode 7和Swift 2.0版本,您无需添加@objc(NameOfClass),只需更改"显示数据模型检查器"选项卡中的实体设置,如下所示 -
名称 - "您的实体名称"
类 - "您的实体名称"
模块 - "当前产品模块"
实体类文件的代码将像(在我的代码中实体是家庭) -
import UIKit
import CoreData
class Family: NSManagedObject {
@NSManaged var member : AnyObject
}
Run Code Online (Sandbox Code Playgroud)
这个例子在我的应用程序中使用xCode 7.0 + swift 2.0正常工作
| 归档时间: |
|
| 查看次数: |
34159 次 |
| 最近记录: |