Ошибка проекта CoreData NULL _cd_rawData, но объект не превращается в ошибку - PullRequest
0 голосов
/ 04 февраля 2019

Я получаю ошибку 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

Назначение вызывает ошибку.Но последующее присвоение этому атрибуту массива или любому другому атрибуту массива работает нормально.

...