Загрузка пользовательских форматов файлов iOS с помощью NSData & NSCoding - PullRequest
1 голос
/ 05 апреля 2011

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

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

%n|sectionName

... и следующие n строк разделены каналом, уникальным для этого раздела. В некоторых разделах есть строка заголовка с разделителем каналов, за которой следуют n строк данных (также с разделителями каналов), а в других разделах может быть просто n строк с разделителем каналов. В начале файла есть несколько коротких разделов, а затем, наконец, будет один огромный раздел, описывающий узлы k-арного дерева: их родительско-дочерние отношения и любые данные, связанные с каждым узлом. Все говорят, что размер этих файлов исчисляется десятками мегабайт, возможно, будет больше в будущем.

Наконец, последний момент в том, что я довольно новичок в программировании на iOS.

Я начал с использования NSFileHandle, чтобы получить представление файла как экземпляра NSData. Это было довольно легко, и после изучения интерфейса NSData и попыток оттуда поступить, я заметил протокол NSCoding, который подразумевает возможность архивирования и сериализации объектов в (и из) представления.

Я подумал, что это звучит как что-то, что мне может понадобиться, поскольку я склонен думать о форматах файлов как о просто представлениях, в которые можно маршалировать объекты моей модели. Однако, изучив «Руководство по программированию архивов и сериализаций», я начал сам догадываться. Похоже, API не поддается тому, чего я пытаюсь достичь.

Я пойду сюда в тупик? Должен ли я вместо этого искать подкласс NSInputStream, или я должен использовать другой подход, который мне не хватает?

Ответы [ 4 ]

3 голосов
/ 10 апреля 2011

NSCoding, вероятно, неправильный подход. Он предназначен для сериализации и десериализации типов Objective-C, а не для анализа пользовательского формата файла.

Вероятно, нет необходимости также создавать подкласс NSInputStream. Лучше всего здесь использовать библиотеку stdio C, в частности fgets для чтения строк. Если вы действительно хотите использовать NSInputStream или NSFileHandle, то, безусловно, можете, вам просто нужно разобрать каждую строку из строки самостоятельно (что на самом деле не так сложно).

2 голосов
/ 11 апреля 2011

Я рекомендую использовать Ragel для обработки смарт-кода. Это должно быть гораздо проще, чем использовать NSScanner, если у вас есть базовые леса на месте для установки анализатора и подачи в него байтов до завершения синтаксического анализа.

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

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

NSCoder, вероятно, будет больше проблем, чем стоит для ваших целей. Предполагается, что он будет использоваться как способ сохранения и декодирования объекта Obj-C с кодированием / декодированием, обусловленным требованиями объекта («Хорошо, теперь дай мне int, теперь кратко, как насчет объекта Obj-C сейчас…» «).

1 голос
/ 13 апреля 2011

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

1 голос
/ 05 апреля 2011

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

Во-первых, для разбора нужно подумать, имеет ли смысл вообще использовать Objective-C. Я мог бы написать небольшой вспомогательный скрипт на Perl, который очень подходит для разбора текстовых файлов и записи вывода в файл XML или, лучше, файл plist. Затем этот файл может быть прочитан вашим кодом Objective-C, и вы сможете работать с данными. Вы также можете записать данные в базу данных sqlite, которая также является подходящим форматом файла, так как существуют соединители данных для широкого спектра языков (C, Perl, Python и т. Д.).

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

Я не вижу никаких преимуществ при использовании NSInputStream, поскольку он возвращает только необработанные байты.

Редактировать

Эта предварительная обработка с использованием другого языка невозможна на устройствах iOS AFAIK. Так что эта опция возможна только на Mac.

...