Архитектурный подход к HTTP-коммуникациям и анализ возвращаемого JSON в iOS - PullRequest
1 голос
/ 01 ноября 2011

Добрый вечер, ребята,

Мой вопрос больше касается подхода проектирования / проектирования, чем конкретно технического.

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

Я объясню, что у меня есть (в псевдокоде и объявлениях), и посмотрю, сможете ли вы помочь:

  1. Класс HTTP Fetcher, реализующий необходимые методы делегата NSURLConnection. Я инициализирую класс с помощью селектора метода обратного вызова, например, для возврата к вызывающему классу по завершении

    @implementation HTTPFetcher{
        - (id)initWithUrlRequest:(NSURLRequest *)aRequest receiver:(id)aReceiver action:(SEL)aReceiverAction
        {
         //set the member variables etc..
        }
    
        //all NSURLConnection delegate methods
    
        - (void)connectionDidFinishLoading...
        {
            [receiver performSelector:action withObject:self];
        }
    }
    
  2. У меня есть класс Singleton HTTPController для вызова HTTPFetcher:

    - (void)postWithRequestString:(NSString *)aRequestString
    {
        [urlRequest setHTTPBody:[aRequestString dataUsingEncoding:NSUTF8StringEncoding]];
    
        fetcher = [[HTTPFetcher alloc]initWithUrlRequest:urlRequest receiver:self action:@selector(receivedDataFromService:)];
        [fetcher start];
    }
    
    - (void)receivedDataFromService:(HTTPFetcher *)aFetcher{
        //handle the received data and split the parent object into an NSMutableDictionary
    }
    

Теперь этот подход работает фантастически хорошо для приложения, которое я специально дал для отдельных сущностей, которые мне нужно смоделировать (у меня в основном будет отдельный HTTPController для каждой сущности).

Моя проблема в том, где обрабатывать пользовательский анализ JSON. В настоящее время я выполняю синтаксический анализ в ViewController, где требуются данные, но это слишком близко к источнику и требует дальнейшей абстракции, но я не уверен, как.

Должен ли я включить методы, облегчающие синтаксический анализ, в классы Singleton или я должен создать дополнительные контроллеры для анализа действий?

Я с нетерпением жду ответа от вас

Спасибо

Ответы [ 2 ]

1 голос
/ 01 ноября 2011

Я бы порекомендовал вам создать существующую библиотеку синтаксического анализа JSON, в частности JSONKit Джона Энгельхарта, учитывая, что это, возможно, самая высокая библиотека синтаксического анализа JSON среди iOS.Вообще избавляет вас от реализации пользовательского анализа JSON, но особенно спасает от реализации кода, который оказывается слишком медленным для ваших нужд, а затем вам нужно будет итеративно его улучшать, пока он не станет достаточно быстрым для использования.

Я знаю, что для HTTP-запросов вы уже реализовали такое поведение, но вам может потребоваться изучить ASIHTTPRequest или AFNetworking как сетевые библиотеки общего назначения, имеющие репутациюдовольно крепкийПримечание AFNetworking использует вышеупомянутую библиотеку JSONKit для анализа JSON.


Способ работы ASIHTTPRequest (библиотека, которую я использую в своих проектах) заключается в использовании объекта делегата, реализующего протокол ASIHTTPRequestDelegate, который вы назначаете после создания запроса с URL.Есть глобальная сетевая очередь, которая является просто NSOperationQueue и обрабатывает асинхронные или несколько одновременных активных запросов.

Вы можете setDelegate:, чтобы объект начал проверять, реализовал ли ваш делегат какой-либо из методов вразличные точки, такие как didReceiveData: или requestDidFinish: по умолчанию, но вы также можете установить собственный путь селектора для проверки, используя методы для отдельных операций (setDidFinishSelector:@selector(downloadComplete:)).

Что вы можете сделать, когданапример, происходит обратный вызов didReceiveData:, когда новые полученные данные передаются в буфер, сохраненный в классе-обертке для ASIJSONRequest (или используйте AFNetworking, который уже инкапсулирует это).Когда буфер таков, что в нем есть полный JSON-объект, который можно правильно проанализировать, вы вызываете JSONKit, чтобы выполнить грубую работу, а затем, возможно, отправите еще один обратный вызов себе на ASIJSONRequestDelegate для didReceiveData:,но теперь данные представлены в формате, который может прочитать остальная часть вашего приложения.


Другой метод использования ASIHTTPRequest - с блоками.Существует поддержка установки блока завершения для запроса, блока, который вызывается при получении данных и т. Д. Для этого шаблона разработки вам даже не нужен класс-обертка, просто установите блок кода для выполнения самого анализа ивернуть любые новые данные, проанализированные в желаемое место назначения.

1 голос
/ 01 ноября 2011

Одной из возможностей было бы для контроллера View или View запросить объект Model для любого состояния, в котором он нуждается (включая данные с удаленного сервера). Объект Model будет сообщен, когда появятся какие-либо новые данные с сервера, и он сможет затем вызвать любые необходимые процедуры обработки данных, необходимые для обновления своего внутреннего состояния (например, преобразование plists или json в более канонический формат словаря).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...