core-data - CoreData Swift 和 transient 属性 getter

标签 core-data swift

关于在 Swift 中使用 Core Data 时实现计算属性的任何建议?

使用生成的 ManagedObject 类,我试图重写 getter 但出现错误:

'NSManaged' not allowed on computed properties

这意味着您不能覆盖 transient (计算)属性的 getter。

在下面的代码示例中,dateDue 在我的模型中被定义为 transient 属性。

请注意,@NSManaged 行是由 Xcode 生成的 - 不是我添加的。

@NSManaged var timeStamp: NSDate
@NSManaged var dateDue: String { 
    get {

        self.willAccessValueForKey("dateDue")
        var ddtmp  = self.primitiveValueForKey("dateDue") as String?
        self.didAccessValueForKey("dateDue")

        if (ddtmp == nil)
        {

            let calendar = NSCalendar.currentCalendar()

            let components = calendar.components((NSCalendarUnit.YearCalendarUnit | NSCalendarUnit.MonthCalendarUnit ) , fromDate: self.timeStamp)
            ddtmp = "\(components.year * 1000 + components.month)"
            self.setPrimitiveValue(ddtmp, forKey: "dateDue")

        }



        return ddtmp!
    }

}

最佳答案

首先,在数据模型中创建一个 transient 属性(section)。因为它是 transient 的,所以它没有物理存储,因此也没有存储在托管对象上下文中。

section 属性如下所示:

enter image description here

实体显示在这里:

enter image description here

类 NSManagedObject 的子类应该具有计算的“section”属性。 NSManagedObject 子类演示了如何完成此操作,如下所示:

class Number: NSManagedObject {

    @NSManaged var number: NSNumber

    var section: String? {
        return number.intValue >= 60 ? "Pass" : "Fail"
    }
}

然后您必须将 NSFetchedResultsController 初始化器中的 sectionForKeyPath 设置为数据模型中的临时属性键和缓存名称(如果需要)。

override func viewDidLoad() {
        super.viewDidLoad()

        fetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest(), managedObjectContext: managedObjectContext!, sectionNameKeyPath: "section", cacheName: "Root")
        fetchedResultsController?.delegate = self
        fetchedResultsController?.performFetch(nil)

        tableView.reloadData()
}

func fetchRequest() -> NSFetchRequest {

    var fetchRequest = NSFetchRequest(entityName: "Number")
    let sortDescriptor = NSSortDescriptor(key: "number", ascending: false)

    fetchRequest.predicate = nil
    fetchRequest.sortDescriptors = [sortDescriptor]
    fetchRequest.fetchBatchSize = 20

    return fetchRequest
}

结果是一个 UITableViewController,其成绩按通过或失败动态排序:

enter image description here

我做了一个示例项目,可以在 GitHub 上找到.

关于core-data - CoreData Swift 和 transient 属性 getter ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25960555/

相关文章:

ios - 核心数据模型似乎没有反射(reflect)在应用程序中

iphone - 后台删除在启动后不起作用

arrays - 带有数组的 Swift nil 合并运算符

iOS核心数据IN运算符,无法解析格式字符串

objective-c - NSManagedObjectContextDidSaveNotification 更新 UI 的最佳方法?

ios - 如何使用核心数据执行插入/更新

ios - 如何找到瞳孔中心和眼镜框边缘之间的距离

swift - 如何在 swift shell 应用程序中制作可编辑的文本字段

swift - didHighlightItemAtIndexPath 未按预期工作

ios - UIImageView 不遵循我应用的约束