Приложение для iOS на основе NSNotification - PullRequest
1 голос
/ 26 мая 2011

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

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

Ответы [ 2 ]

1 голос
/ 26 мая 2011

Не думаю, что было бы неплохо использовать отдельный поток для обработки связи. Помимо того, что это сложно, в этом нет необходимости, поскольку 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 может быть свой делегат.

0 голосов
/ 26 мая 2011

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

[[DataLayer sharedInstance] fetchDataWithDelegate:self];

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

...