无法访问 CoreData
Posted
技术标签:
【中文标题】无法访问 CoreData【英文标题】:Unable to access CoreData 【发布时间】:2017-10-29 18:56:54 【问题描述】:我正在开发一个正在运行的应用程序,由于某种原因,当我尝试访问数据以将其映射出来时出现错误 sudo gem install cocoapods-deintegrate cocoapods-clean
致命错误:在展开可选值时意外发现 nil
和
线程 1:EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0) 在下一行
let locations = run.locations
如果我把它改成
let locations = run?.locations
我在应用程序中收到“else”消息,但它没有崩溃。
我知道数据在那里,因为我与 Liya 确认了它。不知道为什么我的应用看不到它。
下面是剩下的代码
var run : Run!
func loadMap()
guard
let locations = run.locations,
locations.count > 0,
let region = mapRegion()
else
let alert = UIAlertController(title: "Error",
message: "Sorry, this run has no locations saved",
preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "OK", style: .cancel))
present(alert, animated: true)
return
print("loadMap")
mapView.setRegion(region, animated: true)
mapView.add(polyLine())
TIA
【问题讨论】:
您已将run
声明为隐式展开的可选项,但您需要为其实际分配一个值,否则它将是nil
。你在哪里从 Core Data 获取数据并赋值?
请原谅这个愚蠢的问题,因为我真的很陌生,但这不是第一行在做什么吗?如果我在那之后尝试调用 run,.locations 和所有其他属性都会出现
不,该行只是声明了一个 Run!
类型的变量 run
(隐式展开的可选 Run
)。您需要将Run
的实例实际分配给该变量,否则它将是nil
;这就是为什么你在使用时会崩溃的原因!但不是当你有条件地用 ? 解开它时。您需要对 Core Data 执行 fetch 以检索以前保存的 Run
对象并将其分配给该属性。
【参考方案1】:
布埃诺!谢谢。
好的。所以这里是
已删除
var run : Run!
声明一个空数组,因为 fetch 返回 [Any]
var locations : [Any] = []
添加代理
let appDelegate = UIApplication.shared.delegate as? AppDelegate
然后将获取数据函数编写为带有完成处理程序的扩展
extension MapsViewController
func fetch(completion: (_ complete: Bool) -> ())
guard let managedContext = appDelegate?.persistentContainer.viewContext else return
let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Location")
do
locations = try managedContext.fetch(fetchRequest) //Trys to call CoreData and returns an Array of type [Any] and assigns them to the array of locations
print("fetched data")
completion(true)
catch
debugPrint("could not fetch: \(error.localizedDescription)")
completion(false)
【讨论】:
以上是关于无法访问 CoreData的主要内容,如果未能解决你的问题,请参考以下文章
通过UserNotification自定义操作访问时,CoreData无法初始化托管对象