Пользовательский метод проверки для Core Data не вызывается при вставке - PullRequest
0 голосов
/ 24 января 2019

Я занимаюсь разработкой приложения для iOS, которое использует Core Data.Я пытаюсь реализовать проверку основных данных.У меня пока нет никакой пользовательской логики, поэтому я использую параметр «Определение класса» в модели, чтобы заставить Xcode автоматически создавать подклассы NSManagedObject.В этом случае, согласно документации, я могу поместить свою логику проверки в расширение.Мой код выглядит так:

extension Person {

   func validateEmail(_ value: AutoreleasingUnsafeMutablePointer<AnyObject?>) throws {
        var error: NSError? = nil

    if let email = value.pointee as? String {
        let regex = "^.+@([A-Za-z0-9-]+\\.)+[A-Za-z]{2}[A-Za-z]*$"
        let predicate = NSPredicate(format: "SELF MATCHES %@", regex)

        if !predicate.evaluate(with: email) {
            let errorType = UserErrorType.invalidEmail
            error = NSError(domain: errorDomain, code: errorType.rawValue, userInfo: [ NSLocalizedDescriptionKey : "The email address is invalid." ] )
        }

    } else {
        let errorType = UserErrorType.invalidEmail
        error = NSError(domain: errorDomain, code: errorType.rawValue, userInfo: [ NSLocalizedDescriptionKey : "The email address is invalid." ] )
    }

    if let error = error {
        throw error
    }
}

К сожалению, мой код проверки никогда не вызывается.Я знаю, что он вызывается только при фактическом сохранении контекста, но он никогда не вызывается.Я также пытаюсь:

let entity = NSEntityDescription.entity(forEntityName: "Person", in: self.persistentContainer.viewContext)

let person = NSManagedObject(entity: entity!, insertInto: self.persistentContainer.viewContext) as! Person

person.age = 16
person.hasDrivingLicense = true
person.email = "novalidemail"

do {
    try person.validateForInsert()

   } catch {
      let validationError = error as NSError

        print(validationError)
    }

Но мой метод проверки никогда не вызывается.Другой тест, который я сделал, состоял в том, чтобы переопределить validateValue следующим образом в расширении:

public override func validateValue(_ value: AutoreleasingUnsafeMutablePointer<AnyObject?>, forKey key: String) throws {
    print("\(key)")
}

Этот последний метод вместо этого вызывается для всех ключей, включая ключ "email", который я ищу.

1 Ответ

0 голосов
/ 25 января 2019

Я наконец нашел проблему. Префикс @objc к функции проверки сделал его работоспособным, поэтому он вызывается. Итак, вместо:

func validateEmail(_ value: AutoreleasingUnsafeMutablePointer<AnyObject?>) throws {}

Просто:

@objc func validateEmail(_ value: AutoreleasingUnsafeMutablePointer<AnyObject?>) throws {}

Я еще не пробовал этого, потому что в этом проекте, взятом из учебника, у функций валидации нет префикса @objc, и все же они вызываются. Я хотел бы понять разницу и выяснить, зачем мне нужен этот префикс в моем проекте. Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...