HI: я использовал EVReflection, чтобы сделать наш сетевой уровень полностью спокойным, и я должен сказать: УДИВИТЕЛЬНАЯ РАБОТА! Спасибо @evermeer за эту библиотеку. Вы можете получить его здесь: https://github.com/evermeer/EVReflection
Теперь к вопросу:
Следующий шаг - получить эти объекты прямо в ОСНОВНЫЕ ДАННЫЕ. Вот один из рассматриваемых классов
// Вот объект с расширением EVReflectable в качестве требований документации:
import Foundation
import CoreData
import EVReflection
public class NGTripSummary: NSManagedObject { }
extension NGTripSummary: EVReflectable { }
// и ЗДЕСЬ свойства объекта:
// NGTripSummary + CoreDataProperties.swift
import Foundation
import CoreData
extension NGTripSummary {
@nonobjc public class func fetchRequest() -> NSFetchRequest<NGTripSummary> {
return NSFetchRequest<NGTripSummary>(entityName: "NGTripSummary")
}
@NSManaged public var carId: Int64
@NSManaged public var citiesVisited: NSObject?
@NSManaged public var cost: Double
@NSManaged public var distance: Double
@NSManaged public var globalStartDate: NSDate?
@NSManaged public var globalEndDate: NSDate?
@NSManaged public var kpl: Double
@NSManaged public var litres: Double
@NSManaged public var routeLocations: NSObject?
@NSManaged public var sessionId: Int64
@NSManaged public var localStartDate: NSDate?
@NSManaged public var localEndDate: NSDate?
@NSManaged public var duration: Int64
@NSManaged public var speed: Double
@NSManaged public var _id: Int64
@NSManaged public var sessionUuid: String?
@NSManaged public var tripUuid: String?
}
// Вот строка JSON, представляющая демонстрационный объект:
let tripData = "{\"id\":26105240,\"userId\":25796277,\"carId\":25817551,\"vehicleId\":57812351,\"sessionUuid\":\"53324259-aa69-41c8-8f9e-c62bdb70f165\",\"tripUuid\":\"afdd8f55-6d14-4cf9-bd9f-5b6da47aaf93\",\"localStartDate\":1487170622490,\"localEndDate\":1487178323654,\"globalStartDate\":1487163422490,\"globalEndDate\":1487171123654,\"routeLocations\":null,\"litres\":24.7699,\"kpl\":0.0772,\"cost\":153.3258,\"distance\":1.9132,\"duration\":491.958,\"speed\":14.0}"
// и ЗДЕСЬ это метод, который я пытаюсь использовать для создания этого фиктивного объекта:
func makeMockData() {
let singleTrip = NGTripSummary(json: tripData)
print("Single Trip: \(singleTrip)")
}
// СЕЙЧАС: При создании объекта происходит сбой ЗДЕСЬ @ class EVReflection:
// Call your own object validators that comply to the format: validate<Key>:Error:
do {
var setValue: AnyObject? = value as AnyObject?
/* LINE 923: CRASH HAPPENS HERE -> */ try anyObject.validateValue(&setValue, forKey: key)
anyObject.setValue(setValue, forKey: key)
} catch _ {
(anyObject as? EVReflectable)?.addStatusMessage(.InvalidValue, message: "Not a valid value for object `\(NSStringFromClass(type(of: (anyObject as AnyObject))))`, type `\(type)`, key `\(key)`, value `\(value)`")
print("INFO: Not a valid value for object `\(NSStringFromClass(type(of: (anyObject as AnyObject))))`, type `\(type)`, key `\(key)`, value `\(value)`")
}
////////////////// Причина для аварии
[ошибка] ошибка: CoreData: ошибка: не удалось вызвать указанный инициализатор для класса NSManagedObject «NGTripSummary» CoreData: ошибка: CoreData: ошибка: не удалось вызвать указанный инициализатор для класса NSManagedObject «NGTripSummary»
//////////////////////////////////////////////////
-> Кто угодно, ПОЖАЛУЙСТА, ПОМОГИТЕ: -0
2 ответа
EVReflection теперь имеет подспецификацию Cocoapods для CoreData. Для получения дополнительной информации см. https://github.com/evermeer/EVReflection/tree/ мастер / источник / CoreData
Это позволит вам написать код так: \
let moc: NSManagedObjectContext = EVReflectionTestsData().moc // Your code for getting the NSManagedObjectContext.
let obj = CoreDataPerson(context: moc, json: "{\"firstName\" : \"Edwin\", \"lastName\" : \"Vermeer\"}")
try! moc.save() //TODO: implement error handling
Сообщение об ошибке описывает точную проблему. Похоже, вы создаете экземпляры NGTripSummary
с этой строкой кода:
let singleTrip = NGTripSummary(json: tripData)
Но NGTripSummary
является подклассом NSManagedObject
, и вы никогда не вызываете назначенный инициализатор для NSManagedObject
. Это требуется. Вы должны вызвать init(entity:insertInto:)
в NSManagedObject
или использовать фабричный метод insertNewObject(forEntityName:into:)
в NSEntityDescription
для получения действительного управляемого объекта. Если вы этого не сделаете, вы получите эту конкретную ошибку, и ваше приложение падает.
Если вам нужно создать экземпляры с помощью tripData
, вы можете это сделать, но вам также необходимо предоставить контекст управляемого объекта и описание сущности. Вы можете сделать это с помощью удобного инициализатора в вашем классе, который вызовет указанный инициализатор как часть процесса инициализации.
Похожие вопросы
Новые вопросы
ios
iOS - мобильная операционная система, работающая на Apple iPhone, iPod touch и iPad. Используйте этот тег [ios] для вопросов, связанных с программированием на платформе iOS. Используйте связанные теги [target-c] и [swift] для проблем, характерных для этих языков программирования.