Платформа приложений какао с пакетами - PullRequest
3 голосов
/ 27 октября 2009

Хорошо, я создаю основанное на документе приложение в Какао, и тип файла документа фактически является пакетом. В этом пакете находится файл настроек XML, база данных SQLite и zip-файл, который загружается во время выполнения. Теперь единственное, что действительно меняется, - это файл настроек XML, поскольку остальные могут быть воссозданы во время выполнения.

У каждого из этих пакетов будет одно и только одно окно, поэтому я хочу использовать документ на основе. Эти файлы также можно копировать, переименовывать, перемещать и т. Д., Как и любой другой файл, являющийся частью такой архитектуры.

Но я совершенно заблудился, как реализовать это в Documentation Framework! Кажется, везде, где я просматриваю документы, всегда говорится о представлении файлов в памяти, которые вы затем записываете, используя путь, представленный вам в одном из переопределений NSDocument (поскольку Какао может его переместить и т. Д.) Но опять же, я Я использую базу данных SQLite, которая находится на диске, а не в памяти.

Я искал переопределенные методы, которые по-прежнему давали бы мне такие вещи, как проверка состояния документа в грязном состоянии, поддержка диалога открытия и сохранения файла и т. П., Но я не могу найти ничего, что просто говорит: «Вот URL файла ... Откройте его, как считаете нужным, хотя я близко подошел к уровню делегата приложения, по крайней мере, к открытию.

Итак, давайте предположим, что это работает, как ожидалось. Как реализовать сохранение / сохранение как, где я хочу контролировать все, что записывается на диск или нет? Я не хочу (не могу) возиться со структурами данных или тому подобным. Я просто хочу получить psth, который пользователь выбирает в диалоговом окне «Сохранить как» (для нового), и я могу написать то, что мне нужно. Просто. Но опять же, 50-страничный документ от developer.apple.com об архитектуре на основе документов говорит мне, где можно перегружать многие вещи, но, похоже, что каждая из них проистекает из некоторого представления документа в памяти, что опять-таки не какая у меня посылка Технически, только внутренний файл XML является тем, что будет привязано к документу. Все остальное - просто поддержка.

Так? Кто-нибудь? Takers

Mark

Ответы [ 3 ]

2 голосов
/ 28 октября 2009

Кажется, я не могу найти ничего, что просто говорит: "Вот URL файла ... Откройте его, как считаете нужным"

Реализуйте метод readFromURL:ofType:error: в своем классе документов. В качестве альтернативы, поскольку ваш тип документа является типом пакета, реализуйте метод readFromFileWrapper:ofType:error: .

Вам не нужно читать данные в память; вы можете делать все, что захотите, любым способом, который вы реализуете, включая открытие базы данных.

Как реализовать сохранение / сохранение как, где я хочу контролировать все, что записывается на диск или нет?

Реализация метод writeToURL:ofType:error: или метод fileWrapperOfType:error: .

Если бы вы имели или могли легко создавать данные в памяти, вы бы реализовали методы readFromData:ofType:error: и dataOfType:error:. Методы, основанные на URL и обертке файлов, предназначены для случаев, когда данные в памяти недоступны. И основное использование файловых оболочек для таких типов пакетов, как ваш.

1 голос
/ 28 октября 2009

На самом деле, я нашел это. Это не методы «writeTo», а методы «saveTo», которые вы хотите переопределить. Когда я это сделал, код сохранения работал, как я ожидал, включая поддержку панели автоматического сохранения. Для ясности, это я выбрал ...

saveToURL: OfType: forSaveOperation: ошибка:

и это работает как чемпион! Не слишком запутанно, правда! Sheesh !!!

0 голосов
/ 28 октября 2009

Это, конечно, первое, что я попробовал, но если вы прочитаете документацию для разработчиков, в частности, архитектуру на основе документов Какао, то вот что говорится об этих самых методах ...

Во время записи вашему документу может быть предложено записать его содержимое в другое место или с использованием другого типа файла. Опять же, ваш переопределенный метод должен иметь возможность определять все, что ему нужно для записи, из переданных параметров.

Если ваше переопределение не может определить всю необходимую информацию из переданных параметров, рассмотрите возможность переопределения другого метода. Например, если вы видите необходимость вызывать fileURL из переопределения readFromData: ofType: error: возможно, вам следует вместо этого переопределить readFromURL: ofType: error :. В другом примере, если вы видите необходимость вызывать fileURL из переопределения writeToURL: ofType: error: возможно, вам следует вместо этого переопределить writeToURL: ofType: forSaveOperation: originalContentsURL: error:.

Другими словами, кажется, что вы не можете предположить, что переданный вам URL является реальным местом на диске, где в конечном итоге записывается «что-то», что приводит к хаосу при работе с файлами базы данных, которые открывается по URL. Может быть, я что-то упустил.

Но хорошо ... забудь, что я читал это и просто даже пытался просто переопределить эти методы. Я делаю и возвращаю TRUE для каждого (я регистрирую URL, чтобы видеть, что передаётся), я получаю эту ошибку при «Сохранить как» после того, как вы выбрали имя файла ...

2009-10-28 14:31:51.548 XPanel[1001:a0f] dataOfType:error: is a subclass responsibility but has not been overridden.

... но когда вы смотрите на документацию, в которой говорится, что реализация по умолчанию выдает исключение, потому что вы должны переопределить одну из других реализаций выше ... что я, очевидно, только что сделал! Плюс, опять же, это не может быть представлено как простые данные!

Так что, хватаясь за соломинку здесь, я тоже перебил ее и просто возвратил ноль, поскольку опять же, вы не можете представить, что я делаю с объектом NSData. Затем я получаю сообщение «Не удается сохранить».

WTF ?! Почему это так называется ?? !!

... и вот тогда я сдался и разместил это здесь.

Теперь, если ВЫ можете дать мне простой пример, который, возможно, даже не читает и не записывает файл, а просто регистрирует URL, это было бы прекрасно. Не очень полезно, но тем не менее, оно должно работать ... Я просто не могу реализовать, чтобы получить его.

...