Swift 3获取请求错误(警告:无法加载任何Objective-C类信息)

时间:2016-08-06 03:22:06

标签: core-data nsfetchrequest swift3

我从Core Data获取数据时最近收到此错误:

警告:无法加载任何Objective-C类信息。这将显着降低可用类型信息的质量。 (LLDB)

这是我的代码:

// MARK: - Initialize Fetch Request

var fetchedResultsController = NSFetchedResultsController<Profile>()

func setFetchRequest() -> NSFetchRequest<Profile> {

    let request = Profile.fetchRequest()
    let sortDescriptor = SortDescriptor(key: "title", ascending: false)

        do {
            try moc?.fetch(request)
        } catch {
            print("Error With Request: \(error)")
        }
        request.sortDescriptors = [sortDescriptor]

    return setFetchRequest()
}


// MARK: - Retrieve Fetch Request

func getFetchRequest() -> NSFetchedResultsController<Profile> {

    fetchedResultsController = NSFetchedResultsController(fetchRequest: setFetchRequest(), managedObjectContext: moc!, sectionNameKeyPath: nil, cacheName: nil)

    return fetchedResultsController
}

我遇到了这个错误,我有“尝试moc?.fetch(request)”:

线程1 EXC_BAD_ACCESS(代码= 2,地址= 0x16fc07feo)

这些错误是否已连接或者这是Swift 3 / Xcode 8中的错误?

2 个答案:

答案 0 :(得分:0)

您不应该从ManagedObjectContext获取结果。如果您想在应用中使用NSFetchedResultsController课程?您需要访问他们的方法。并且所有必需或可选方法都来自NSFetchedResultsControllerDelegate协议。

试试这个

class YourTableViewController: UITableViewController, NSFetchedResultsControllerDelegate { var fetchedResultsController:NSFetchedResultsController<Profile>! }

然后创建一个像这样的自定义帮助函数:

`func frc(){

    let request:NSFetchRequest<Profile> = Profile.fetchRequest()
    let sorter = SortDescriptor(key: "title", ascending: true)
    request.sortDescriptors = [sorter]

    self.fetchedResultsController = NSFetchedResultsController(fetchRequest: request, managedObjectContext: self.managedObjectContext, sectionNameKeyPath: nil, cacheName: nil)
    // make sure the delegate is set to self
    self.fetchedResultsController.delegate = self

    do {
     try self.fetchedResultsController.performFetch()
    } catch {} 
}

`

从这一点开始,您需要一个触发器来执行操作。因此,当您调用viewDidLoad方法或者您可以创建一个按钮时,系统本身应该这样做。例如,单击按钮开始操作。

override func viewDidLoad() { super.viewDidLoad() self.frc() self.tableView.reloadData() }

它应该是有效的。 祝你好运!

自动生成子类

Xcode 8 Swift 3 带有新一代子类,称为自动子类生成!如何创建它?好!因此,让我们创建一个新的 Xcode 8项目,选择一个单一视图应用程序,然后会出现另一个名为的窗口为您的新项目选择选项:< / em>的。为新项目命名,确保语言为Swift,并选中使用核心数据复选框,然后点击创建

转到YourProjectName.xcdatamodeld文件并单击它。然后添加一个实体!因此,假设您的实体名称是配置文件,并分别创建其属性。知道这一点非常重要,因为这是一个自动子类生成。选择您的实体并转到数据模型检查器!为Codegen You can find a Codegen from here选择类定义

选择类定义后,您可以看到由您的实体名称like so自动填充的名称文本字段。再次转到您的实体并单击它。首先单击 Command + S 进行保存更改,然后单击 Command + B 进行重建,以便进行重建。 自动创建子类已成功创建。

<强>记住

如果您想更改型号?例如:如果要为模型添加新的属性?这很简单,选择xcdatamodeld文件并点击entity。点击Attributes下的加号,然后添加新的属性。更改完成后?不要忘记保存更改。再次单击 Command + S ,然后单击 Command + B

创建受管对象

Swift 3 中,您可以使用子类初始化程序创建ManagedObject。它比以往任何时候都更容易实施

let managedObject = Profile(context: self.managedObjectContext!)

你可以很容易地看到它!如何将值保存到managedObject?因此,我们假设您的模型具有title属性。 title也是String

managedObject.setValue("Well crafted API? Right?", forKey: "title")

managedObject.title = "Well crafted API? Right?"

保存值:

do { try self.managedObjectContext.save() print(managedObject) } catch {}

它在 Swift 3.0 测试版和 Xcode 8.0 测试版中运行良好。

答案 1 :(得分:0)

<强>更新

所以,这就是我为Xcode 8 beta和Swift 3 beta核心数据工作的原因

var fetchedResultsControler = NSFetchedResultsController<Profile>()

func frc() {

let request: NSFetchRequest<Profile> = Profile.fetchRequest()

let sortDescriptor = SortDescriptor(key: "title", ascending: true)
request.sortDescriptors = [sortDescriptor]

self.fetchedResultsControler = NSFetchedResultsController(fetchRequest: request, managedObjectContext: self.moc!, sectionNameKeyPath: nil, cacheName: nil)

self.fetchedResultsControler.delegate = self

do {
try self.fetchedResultsControler.performFetch()
} catch {
    print("Error Fetching Data: \(error)")
    }
}

并且在viewDidLoad中,我在viewDidLoad的顶部有self.frc()。

因此,在我的Profile + CoreDataProperties.swift中,我在创建新项目时复制了Apple在其Master-Detail示例中使用的方法:

扩展档案{

@nonobjc class func fetchRequest() -> NSFetchRequest<Profile> {
    return NSFetchRequest<Profile>(entityName: "Profile");
}
@NSManaged var title: String?
@NSManaged var titleImage: Data

}

这样我的获取请求就是我的功能本身。&#34;很确定这不是正确的说法,但它帮助我理解发生了什么。 Apple的例子中的获取请求是绿色而不是蓝色。我花了很长时间才注意到这一点。我点击了&#34; Event&#34;在Apple的例子中,它被方便地带到创建的子类中,这在WWDC的Xcode 8视频中得到了证明。

例如,文件Event.swift和Event + CoreDataProperties.swift不像它们在Xcode 7.x.x及更早版本中那样公开。您必须单击代码中的实体,然后才能将它们带到它们中。也许那是我的问题?无论如何,我像冠军一样获取数据和图像。非常感谢你的帮助@Mannopson!