【发布时间】:2015-03-07 16:14:20
【问题描述】:
是时候使用Core Data了,但是那里的开放文档和指南花了很多时间谈论一般设置和“幕后”细节。这些东西很重要,但我希望有一个快速、干净的资源来展示如何实际使用存储在 Core Data 模型中的信息。
情景
在我的简单示例中,我有一个实体类型:
Job
- salary [Double]
- dateCreated [Date]
这是一个由故事板提供支持的 Swift iOS 应用程序,默认生成 AppDelegate.swift 来处理我的托管对象上下文的生成。
问题
如何在我的应用程序中使用 Job 实例?
如果您还可以提供有关这些项目的见解,则可以加分:
- 作为习惯于 MVC 设计模式的人,我如何避免在不违背 iOS 开发最佳实践的情况下避免在控制器内部包含脏数据访问?
- 我如何在关注 DRY 时从 Core Data 访问实体?
- 如何在方法和控制器之间传递托管对象,同时保持它们的类型?
Core Data 文档提供some snippets 用于获取记录。这个问题本质上是在询问该逻辑在 iOS 应用程序中的位置,以及在获取记录后如何与获取的记录进行实际交互。
一个例子
这个问题并不是一个广泛而全面的问题,因此我将在尝试使用 Core Data 的示例中将其作为基础。在我的示例中,我有一个带有标签的 UIViewController。我希望这个标签显示一份工作的薪水。
import UIKit
import CoreData
class JobViewController: UIViewController {
@IBOutlet var salaryLabel: UILabel!
let managedObjectContext = (UIApplication.sharedApplication().delegate as AppDelegate).managedObjectContext
func updateLabel() {
var job = getCurrentJob()
salaryLabel.text = job.salary // ERRORS
}
func getCurrentJob()->(???) {
var error: NSError?
if let fetchedResults = managedObjectContext!.executeFetchRequest(NSFetchRequest(entityName:"Job"), error: &error) {
return fetchedResults[0]
}
}
override func viewDidLoad() {
super.viewDidLoad()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}
这个例子不能编译有两个原因:
- 我没有为 getCurrentJob 指定返回类型,因为我不确定要返回什么类型
- 尝试访问
salary属性的带有“ERRORS”的行会出错,因为无法知道薪水是工作的实际属性。
如何传递和使用作业对象?
【问题讨论】:
-
这是一个非常大的问题...您可以下载漂亮而简单的库,它有一个很好的核心数据管理器ObjectiveRecord,还可以让您将一些数据从 JSON 字典映射到您的核心数据。它是开源项目,因此您可以将管理器实现视为示例
-
@aquarium_moose 恕我直言,不需要特殊库:Core Data 本身可以很好地涵盖这一点
-
UIViewControllers 是什么类型的? -
@Drux 的 UIViewControllers 链接到故事板,除此之外我不确定你的意思:-/
-
现在听起来肯定更土气了 :) 所以你需要一个核心数据模型(新/文件/核心数据/数据模型),它有一个实体(工作)和两个属性。然后,您可以从中为 Job.swift 生成 Swift 代码(Editor / Create NSManagedObject Subclass ...),这将允许您执行 job.salary。这些是 Objective-C 的常用步骤,也适用于 Swift。但是,在 Swift 中,您也可以使用 @NSManagedObject 注解。我没有这方面的经验,但谷歌是你的朋友......