Swift Core Data - 使用 NSManagedObject 子类访问获取的实体时出错

Posted

技术标签:

【中文标题】Swift Core Data - 使用 NSManagedObject 子类访问获取的实体时出错【英文标题】:Swift Core Data - Error accessing fetched entity with NSManagedObject Subclass 【发布时间】:2014-11-12 02:03:27 【问题描述】:

我正在尝试获取核心数据实体,但遇到了一个问题,我认为这是由于我使用了子类 NSManagedObject。

尝试打印出其中一个获取的对象我收到以下错误:

Thread 1: EXC_BAD_ACCESS (code=1, address=0x0)

这是我的“显示”NSManagedObject 子类:

import Foundation
import CoreData

@objc(Show)
class Show: NSManagedObject 

    @NSManaged var dateUpdated: NSDate
    @NSManaged var fontFilename: String
    @NSManaged var fontName: String
    @NSManaged var idShow: NSNumber
    @NSManaged var isActive: NSNumber
    @NSManaged var productIdentifier: String
    @NSManaged var title: String


这是我在助手类 CoreDataManager.swift 中的获取调用:

func fetchShows() -> Array<AnyObject>?

    // This function will fetch data for all available shows.
    // Return value will be an array of dictionaries (i.e. [0]->Show, Characters)
    // i.e. Show Title, Store Product Identifier, Font, Characters, etc.
    var results = Array<AnyObject>()

    let context:NSManagedObjectContext = self.managedObjectContext!
    var error: NSError?
    var fetchRequest = NSFetchRequest()
    let entity = NSEntityDescription.entityForName("Show", inManagedObjectContext: context)
    fetchRequest.entity = entity

    let fetchedObjects = context.executeFetchRequest(fetchRequest, error: &error)! as Array
    for item in fetchedObjects
    
        var showData = Dictionary<String, AnyObject>()
        let show: Show = item as Show
        showData.updateValue(show, forKey: "show")

        // Get Characters
        showData.updateValue(self.fetchCharactersForShow(show.idShow)!, forKey: "characters")
        results.append(showData)

        // Test
        self.printShow(show.idShow) //NOTE - THIS METHOD CREATES A NEW FETCH REQUEST USING THE PROVIDED SHOW ID AND SUCCESSFULLY PRINTS OUT THE SHOW DATA
    
    return results

这是我现在尝试访问从 RootViewController.swift 获取的值的地方:

    //TESTING
    self.shows = CoreDataManager().fetchShows()!
    let showData = self.shows[0] as Dictionary<String, AnyObject>
    let show = showData["show"] as Show
    println("TEST: Show \(show.title) is active: \(show.isActive.boolValue)")
    /******/

以下是“显示”对象的调试器截图:

【问题讨论】:

【参考方案1】:

哇,我觉得自己好笨。 似乎问题出在我调用“fetchShows()”方法的方式上。 我需要实际创建和分配一个“CoreDataManager”对象并使用该对象调用该方法,而不是尝试仅调用类方法:

let DataManager = CoreDataManager()
self.shows = DataManager.fetchShows()

现在它可以工作了!

【讨论】:

这对我来说是个谜,为什么当调试器愉快地显示对象时会发生这种情况,但我认为通过不“保留”模型对象,实体对象的后备存储在它们得到之前就被废弃了正确唤醒(在我的情况下,其中一个属性是可转换的,因此在需要之前不会构建它是有道理的)。不过,您可能需要它一直待到将来某个未定义的时间点,所以使用惰性属性来保留拥有的对象可能是要走的路。

以上是关于Swift Core Data - 使用 NSManagedObject 子类访问获取的实体时出错的主要内容,如果未能解决你的问题,请参考以下文章

Core Data 使用 Swift 保存数据

Swift 3.0 使用Core Data

使用 Swift 使用 Core Data 对象填充 UIPickerView

Swift 3. 使用 Core Data 隐藏一个空的 tableView

iOS:Swift:Core Data:值不使用 Private ManagedObjectContext 存储

searchDisplayController、UITableView、Core Data 和 Swift