Приложение для 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];
Этот метод может порождать фоновый поток и отвечать на делегат в основном потоке.