Как получить сущности отношений при выполнении миграции основных данных? - PullRequest
0 голосов
/ 15 апреля 2020

Я выполняю миграцию основных данных. У меня есть этот подкласс для моей миграции:

class TagtoSkillMigrationPolicyV1toV2: NSEntityMigrationPolicy {

    override func createDestinationInstances( forSource sInstance: NSManagedObject, in mapping: NSEntityMapping, manager: NSMigrationManager) throws {

        // 1 - create destination instance of skill and skillmetadata
        let skillEntityDescription = NSEntityDescription.entity( forEntityName: "Skill",in: manager.destinationContext)
        let newSkill = Skill(entity: skillEntityDescription!, insertInto: manager.destinationContext)

        let skillMetaDataDescription = NSEntityDescription.entity(forEntityName: "SkillMetaData", in: manager.destinationContext)
        newSkill.metaData = SkillMetaData(entity: skillMetaDataDescription!, insertInto: manager.destinationContext)

        var posts = sInstance.value(forKey: "posts")
        posts.sort {
            ($0.timeStamp! as Date) < ($1.timeStamp! as Date)
        }
        if let mostRecentThumbnail = posts.first?.postImage {
            let thumbnail = Utils.makeThusmbnail(url: URL(string: mostRecentThumbnail)!, for: 150.0)
            newSkill.metaData?.thumbnail = thumbnail?.pngData()
        }

        if let name = sInstance.value(forKey: "name"){
            newSkill.setValue(name, forKey: "name")
        }
        manager.associate(sourceInstance: sInstance, withDestinationInstance: newSkill, for: mapping)
    }
}

Это пользовательская миграция из моей старой сущности Tag в мою новую сущность Skill. Для каждого тега он создает сущность навыка и сущность skillmetaData, которые он прикрепляет к нему. В файле .xcmappingmodel нет записей, так как я делаю все вручную - пожалуйста, дайте мне знать, если мне все еще нужны записи там.

Прямо сейчас, когда он запускается, он дает сигнал SIGABRT:

Could not cast value of type '_NSFaultingMutableOrderedSet' (0x7fff87c44e80) to 'NSArray' (0x7fff87c51fb0).
2020-04-14 15:55:40.108927-0700 SweatNetOffline[28046:3645007] Could not cast value of type '_NSFaultingMutableOrderedSet' (0x7fff87c44e80) to 'NSArray' (0x7fff87c51fb0).

Когда я устанавливаю точку останова и проверяю sInstance.value(forKey: "posts"), я получаю

▿ Optional<Any>
  - some : Relationship 'posts' fault on managed object (0x6000010dcf00) <NSManagedObject: 0x6000010dcf00> (entity: Tag; id: 0xdf4b05c2e82b2c4e <x-coredata://A6586C18-60C3-40E7-B469-293A50EB5728/Tag/p1>; data: {
    latestUpdate = "2011-03-13 00:17:25 +0000";
    name = flowers;
    posts = "<relationship fault: 0x600002607f40 'posts'>";
    uuid = "4509C1B3-7D0F-4BBD-AA0B-7C7BC848DA80";
})

таким образом, это не полностью загружает те должности - это дает эту ошибку там.

Цель состоит в том, чтобы получить миниатюру из последних сообщений. Как я могу получить доступ к этому элементу отношений?

1 Ответ

0 голосов
/ 16 апреля 2020

Я нашел способ сделать это, используя

let lastThumbnail = sInstance.mutableOrderedSetValue(forKeyPath: "posts.postImage").lastObject

Чтение это очень помогло. Насколько я понимаю, на данном этапе миграции мы имеем дело с NSManagedObjects, а не с реальной моделью, которая имела бы такие атрибуты, как «записи», как это обычно бывает в основных данных.

В Objective- C особенно и быстро, до некоторой степени, объекты NSO доступны с помощью кодирования ключ-значение. К ним обращаются косвенно - то есть вместо того, чтобы читать сам объект, вы читаете то, что NSMutableOrderedSet хочет показать вам для этого ключа - так что он может что-то с ним сделать, прежде чем представить его. Таким образом, вы не можете, например, получить просто «forKey: posts», а затем ожидать, что посты будут иметь атрибуты, которые обычно имеют ваши посты. Любой может выкинуть sh из этого объяснения, если он знает больше :).

Одна вещь, которую я пытался сделать, - это сортировать по этому ключевому пути сортируемым способом - так, чтобы я мог найти сообщение, которое имеет самую последнюю временную метку, а затем использовать этот связанный эскиз. Вместо этого я использую .lastObject, который работает, потому что это NSMutableOrderedSet, а не NSMutableSet, потому что в моей исходной модели это отношение было упорядоченным. Это означает, что он выберет последний вставленный элемент, который мне пока подходит. Все еще интересует способ фильтровать этот результат, хотя, если у кого-то есть совет.

...