Реляционная целостность и проверка в Core Data iCloud Syncing

Рассмотрим следующую простую модель сущностей: сущность A имеет однозначную связь с сущностью B, называемую b. Сущность B имеет отношение, обратное единице, называемое a. Ни одно из отношений не является необязательным.

A            B
b  < ----- > a

Предположим, у нас есть два устройства (1) и (2), которые начинают полностью синхронизироваться. У каждого есть один объект класса A и один объект класса B, и они связаны друг с другом.На устройстве 1 у нас есть объекты A1 и B1, а на устройстве B у нас есть такие же логические объекты A1 и B1.

Теперь предположим, что имитационные изменения сделаны на каждом устройстве:

На устройстве 1 мы удаляем B1, вставляем B2 и связываем A1 с B2. потом Сохранить изменения.
На устройстве 2 мы удаляем B1, вставляем B3 и связываем A1 с В3. Затем сохраните изменения.

Теперь устройство 1 попытается импортировать журналы транзакций с устройства 2. Будет вставлено устройство B3, а устройство A1 будет связано с устройством B3. Пока все хорошо, но B2 теперь остается с отношением aравным nil. Связь и не является обязательной, поэтому возникает ошибка проверки.

Нечто подобное произойдет на устройстве 2, потому что есть два объекта B и только один объект A, с которым нужно связать. Таким образом, всегда должна быть ошибка проверки, потому что один из объектов B должен иметь отношение a, установленное на nil.

Хуже того, любое будущее изменение всегда оставит ошибочный объект B висящим без дела, и, таким образом, не пройдет проверку. По сути, пользователь не может решить проблему самостоятельно, сбросив отношения. Он постоянно сломан.

Вопрос в том, как можно устранить такую ​​ошибку проверки? Все это происходит до того, как сработает уведомление NSPersistentStoreDidImportUbiquitousContentChangesNotification. Это не ошибка проверки в вашем приложении main NSManagedObjectContext, это ошибка проверки, возникающая во время первоначального импорта журналов транзакций в постоянное хранилище.

Единственный вариант, который я могу придумать, это попытаться удалить недопустимый объект B в пользовательском установщике ( setA:) или в методе проверки KVC ( validateA:error:) на самом классе B, потому что они, похоже, запускаются во время импорта журнала транзакций. Но я не уверен, что побочные эффекты, подобные этим, разрешены, и когда я пытаюсь это сделать, это, кажется, приводит к неприятным сообщениям в журнале на этот счет.

Кто-нибудь знает, как правильно с этим справиться?

6
задан Drew McCormack 17 April 2012 в 15:17
поделиться