Я получаю ошибку CoreData: fault: NULL _cd_rawData, но объект не превращается в ошибку.Я посмотрел на многие вопросы, связанные с этой проблемой, и все они связаны с проблемой потока, но я делаю все в основном потоке, используя NSPersistentContainer.viewContext.
Проблема возникает, когда я впервые ссылаюсь на атрибут Entity, который является трансформируемым типом, который является массивом Swift типа [Double].Последующие обращения не показывают ошибку.Ошибка также не создает общую ошибку программы, и выполнение продолжается.
Поскольку многие другие вопросы предполагают, что это проблема параллелизма потоков, я запускаю программу с параметром -com.apple.CoreData.ConcurrencyDebug 1 ', но когда ошибка появляется в консоли, ожидаемые ошибки не возникают из ConcurrencyDebugфлаг.
Код моего запроса на выборку приведен ниже.
Я программно установил связь между SMLocation и FlatPricing.Атрибуты массива FlatPricing имеют проблему, но только в первый раз я получаю доступ к значению атрибута.
public class FlatPricing: NSManagedObject {
....
@NSManaged public var monthlyRate: [Double]?
@NSManaged public var monthlyUseCap: [Double]?
@NSManaged public var householdsAtCap: [Int]?
....
}
func fetchThenSetManagedObjects(forLocation loc: String) -> SMLocation? {
let fetchReq: NSFetchRequest<SMLocation> = SMLocation.fetchRequest()
fetchReq.resultType = .managedObjectResultType
fetchReq.predicate = NSPredicate(format: "smlName == %@",loc)
var fetchRes: [SMLocation] = [SMLocation]()
do {
fetchRes = try persistentContainer.viewContext.fetch(fetchReq)
} catch {
print("Core Data Fetch failed")
print(error)
return nil
}
// now set all the managed objects
return fetchRes[0]
}
Я установил объект FlatPricing следующим образом в различных частях моего кода:
....
guard let smLoc = fetchThenSetManagedObjects(forLocation: currentLocation) else {
print("Fetch failed for locationSelect")
return
}
let initFlatPricing = (smLoc.value(forKey: "flatPricing") as! FlatPricing)
Когда я получаю доступ к такому атрибуту, как:
guard var h = initFlatPricing.householdsAtCap else {
return
}
h[0] = 12
Назначение вызывает ошибку.Но последующее присвоение этому атрибуту массива или любому другому атрибуту массива работает нормально.