sli*_*fty 5 core-data ios swift
现在是时候使用Core Data了,但开放的文档和指南花了很多时间来讨论一般设置和细节"幕后"的细节.这些事情很重要,但我希望快速,干净的资料显示如何实际使用存储在Core Data模型中的信息.
情景
在我的简单示例中,我有一个实体类型:
Job
- salary [Double]
- dateCreated [Date]
Run Code Online (Sandbox Code Playgroud)
这是一个由故事板驱动的Swift iOS应用程序,默认生成的AppDelegate.swift处理我的托管对象上下文的生成.
问题
如何在我的应用程序中使用Job实例?
如果您还可以提供有关这些项目的见解,那么奖励积分:
- 作为习惯于MVC设计模式的人,如何在不违反iOS开发最佳实践的情况下避免在我的控制器中包含脏数据访问?
- 如何在关注DRY时访问Core Data中的实体?
- 如何在保持类型的同时在方法和控制器之间传递托管对象?
Core Data文档提供了一些用于获取记录的片段.这个问题基本上是询问逻辑在iOS应用程序中的位置,以及如何在获取它们之后实际与获取的记录进行交互.
一个例子
这个问题并不是一个广泛而彻底的问题,因此我将在一个使用核心数据的示例尝试中将其作为基础.在我的例子中,我有一个带有标签的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()
}
}
Run Code Online (Sandbox Code Playgroud)
此示例无法编译,原因有两个:
salary属性的"ERRORS"行会出错,因为无法知道薪水是作业的实际属性.如何传递并使用作业对象?
上面示例中的关键缺失部分是NSManagedObject子类,在Swift中是@NSManagedSwift注释.NSManagedObject是一个通用类,它以最简单的形式可以扩展为只提供对Core Data实体属性的访问,但实际上这是传统模型逻辑应该存在的地方.
创建NSManagedObject子类
您可以通过查看Core Data模型并使用菜单命令自动生成这些对象:Editor->Create NSManagedObject Subclass.
这将生成Job.swift(或任何您的实体名称)
import Foundation
import CoreData
class Job: NSManagedObject {
@NSManaged var dateCreated: NSDate
@NSManaged var salary: NSNumber
}
Run Code Online (Sandbox Code Playgroud)
使用NSManagedObject子类
您的新课程现在可供使用,您可以相应地对获取的结果进行类型转换!完成后,这是以前破坏的示例的更新版本
import UIKit
import CoreData
class JobViewController: UIViewController {
@IBOutlet var salaryLabel: UILabel!
let managedObjectContext = (UIApplication.sharedApplication().delegate as AppDelegate).managedObjectContext
func updateLabel() {
var job:Job = getCurrentJob()
salaryLabel.text = job.salary // ERRORS
}
func getCurrentJob()->Job {
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()
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
21381 次 |
| 最近记录: |