Swift, GCD and CoreData error: error: NULL _cd_rawData but the object is not being turned into a fault
Swift, GCD and CoreData error: error: NULL _cd_rawData but the object is not being turned into a fault
我写了一些代码来准备来自 CoreData 的异步数据。我已经按照互联网上的提示进行操作,但有时会出现以下错误:
CoreData: error: NULL _cd_rawData 但对象没有变成错误
这是我的代码,它执行从核心数据读取对象并抛出错误。
func getObject(forKey: String, answer: (Bool, NSObject?) -> ()) {
let pMOC = initPrivateMOC()
pMOC.performBlock({
let fetchRequest = NSFetchRequest()
let entityDescription = NSEntityDescription.entityForName("CacheObject", inManagedObjectContext: pMOC)
fetchRequest.entity = entityDescription
fetchRequest.predicate = NSPredicate(format: "identifier == %@", forKey)
do {
let result = try self.managedObjectContext?.executeFetchRequest(fetchRequest) as! [CacheObject]
var answerObject:NSObject?
if !result.isEmpty {
if let coObject = result[0].object {
if let retrievedObject = NSKeyedUnarchiver.unarchiveObjectWithData(coObject) as? NSObject {
answerObject = retrievedObject
}
}
}
answer(true, answerObject)
} catch {
answer(false, nil)
fatalError("[CacheManager:getObject] -> Fehler beim Lesen von Daten")
}
})
}
在 if let coObject = result[0].object
时出现错误。下面是获取私有MOC的函数:
init() {
let coreDataHandler = CoreDataHandler(identifier: "MK.SimpleCacheStore", ressource: "SimpleCache")
self.managedObjectContext = coreDataHandler.getMOC()
}
func initPrivateMOC() -> NSManagedObjectContext {
let pMOC = NSManagedObjectContext(concurrencyType: .PrivateQueueConcurrencyType)
pMOC.parentContext = self.managedObjectContext
return pMOC
}
还有来自上面 class 的调用,请求访问:
public func get(forKey: String, answer: (Bool, NSObject?) -> ()) {
if let cam = cacheManager {
if let cachedObj = cam.getObjectFromCache(forKey) {
print("[SCManager:get] -> Objekt aus NSCache geladen")
answer(true, cachedObj)
} else {
if let cdm = coreDataManger {
dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0), {
cdm.getObject(forKey, answer: {
success, data in
//Enable Entry in NSCache
if let cdData = data {
cam.saveObjectToCache(forKey, object: cdData)
print("[SCManager:get] -> Objekt nach nicht auffinden gecacht")
}
print("[SCManager:get] -> Objekt nicht in NSCache, deshalb aus CoreData")
answer(success, data)
})
})
}
}
}
你知道这个问题吗,或者在我实现 GCD 和 CoreData 的方式中发现任何错误或问题,提示会很有帮助。
我发现了问题,我没有在我的请求中添加私有 MOC。所以解决方案是使用 pMOC for fetchRequest()
我写了一些代码来准备来自 CoreData 的异步数据。我已经按照互联网上的提示进行操作,但有时会出现以下错误: CoreData: error: NULL _cd_rawData 但对象没有变成错误
这是我的代码,它执行从核心数据读取对象并抛出错误。
func getObject(forKey: String, answer: (Bool, NSObject?) -> ()) {
let pMOC = initPrivateMOC()
pMOC.performBlock({
let fetchRequest = NSFetchRequest()
let entityDescription = NSEntityDescription.entityForName("CacheObject", inManagedObjectContext: pMOC)
fetchRequest.entity = entityDescription
fetchRequest.predicate = NSPredicate(format: "identifier == %@", forKey)
do {
let result = try self.managedObjectContext?.executeFetchRequest(fetchRequest) as! [CacheObject]
var answerObject:NSObject?
if !result.isEmpty {
if let coObject = result[0].object {
if let retrievedObject = NSKeyedUnarchiver.unarchiveObjectWithData(coObject) as? NSObject {
answerObject = retrievedObject
}
}
}
answer(true, answerObject)
} catch {
answer(false, nil)
fatalError("[CacheManager:getObject] -> Fehler beim Lesen von Daten")
}
})
}
在 if let coObject = result[0].object
时出现错误。下面是获取私有MOC的函数:
init() {
let coreDataHandler = CoreDataHandler(identifier: "MK.SimpleCacheStore", ressource: "SimpleCache")
self.managedObjectContext = coreDataHandler.getMOC()
}
func initPrivateMOC() -> NSManagedObjectContext {
let pMOC = NSManagedObjectContext(concurrencyType: .PrivateQueueConcurrencyType)
pMOC.parentContext = self.managedObjectContext
return pMOC
}
还有来自上面 class 的调用,请求访问:
public func get(forKey: String, answer: (Bool, NSObject?) -> ()) {
if let cam = cacheManager {
if let cachedObj = cam.getObjectFromCache(forKey) {
print("[SCManager:get] -> Objekt aus NSCache geladen")
answer(true, cachedObj)
} else {
if let cdm = coreDataManger {
dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0), {
cdm.getObject(forKey, answer: {
success, data in
//Enable Entry in NSCache
if let cdData = data {
cam.saveObjectToCache(forKey, object: cdData)
print("[SCManager:get] -> Objekt nach nicht auffinden gecacht")
}
print("[SCManager:get] -> Objekt nicht in NSCache, deshalb aus CoreData")
answer(success, data)
})
})
}
}
}
你知道这个问题吗,或者在我实现 GCD 和 CoreData 的方式中发现任何错误或问题,提示会很有帮助。
我发现了问题,我没有在我的请求中添加私有 MOC。所以解决方案是使用 pMOC for fetchRequest()