Принятие NSSecureCoding с непрозрачными типами

У меня есть класс Objective-C, который должен принять NSSecureCoding для передачи через соединение XPC. У класса есть пара свойств непрозрачных типов (dispatch_queue_t и dispatch_group_t).

Как мне реализовать -initWithCoder: и -encodeWithCoder: в этом случае? В документации говорится, что это объектные структуры, поэтому я предполагаю, что их нужно будет преобразовать в/из необработанных байтов при кодировании/декодировании? Если это так, я не уверен, какие методы следует использовать для этого. Другой вариант — вообще не кодировать их и воссоздавать внутри -initWithCoder:.


person Andrew    schedule 20.08.2013    source источник
comment
Вы ответили на свой вопрос. Это непрозрачные типы, поэтому вы не можете их кодировать и декодировать позже. Вам придется воссоздать их в -initWithCoder:.   -  person Kurt Revis    schedule 20.08.2013


Ответы (1)


Не существует общего решения для всех непрозрачных типов, но вы упомянули dispatch_queue_t и dispatch_group_t. Если очередь отправки и группа являются частными для закодированного объекта, то просто воссоздайте их в -initWithCoder:, как сказал Курт Ревис. Если они общие, это немного сложнее, но иногда вы можете обойти это, заархивировав «суррогатный» объект, а затем пройдя свой граф объектов после его декодирования, заменив все ссылки на суррогат ссылками на один, только что созданный «настоящий» объект.

Хотя на самом деле это подозрительно похоже на анти-паттерн. Классы, которые реализуют NSCoding/NSSecureCoding, как правило, являются классами моделей, и наличие очередей и групп отправки в ivars модельного класса является своего рода красным флагом. Я могу придумать некоторые законные причины иметь частную очередь (т. е. сериализацию многопоточного доступа к внутреннему состоянию) в ivar класса модели, но не общую. В общем, похоже, что некоторый рефакторинг может быть в порядке.

person ipmcc    schedule 21.08.2013