Приложение для iOS на основе NSNotification

В настоящее время я думаю о модели данных для моего приложения для iOS. Приложение получает информацию только с сервера, и поэтому сама "модель" обычно выполняет все веб-запросы...
Однако эти сетевые запросы должны выполняться в фоновом режиме - я имею в виду другую задачу, а не фоновое состояние iOS - и после завершения запроса информация в приложении должна обновляться.

Будет ли более разумным написать делегата для информирования контроллера или я могу также использовать NSNotificationCenter? Я думаю, что решение на основе NSNotification может сделать модель более универсальной, например, в настольном приложении.
И, возможно, я должен добавить: модель (поскольку она сохраняет некоторую информацию о сеансе) является одноэлементной, поэтому обычный метод на основе делегатов не будет работать...

2 ответа

Решение

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

Подробно вы можете создать NSURLRequest, выполнив:

NSURLRequest* yourReq = [NSURLRequest requestWithURL:yourURL];

затем создайте NSURLConnection с:

NSURLConnection* yourConnection = [NSURLConnection connectionWithRequest:yourReq delegate:yourDelegate];

и начать это с:

[yourConnection start];

Когда данные будут готовы, один из методов для вашего делегата (connectionDidFinishLoading:, или же connection:didFailWithError:) будет вызван, чтобы вы могли обновить свой интерфейс.

Все это без блокировки.

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

РЕДАКТИРОВАТЬ: если вы обеспокоены тем, что, будучи вашей моделью синглтон, вы не можете иметь делегата, позвольте мне предложить вам изучить этот вопрос.

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

Это возможно несколькими механизмами с NSURLConnection, но если вы используете ASIHTTPRequest, это станет действительно легко, потому что каждый ASIHTTRequest может иметь своего собственного делегата.

Решение для делегатов работает и рекомендуется. Это выглядит примерно так:

[[DataLayer sharedInstance] fetchDataWithDelegate:self];

Этот метод может порождать фоновый поток и отвечать на делегат в основном потоке.

Другие вопросы по тегам