Использование CocoaHTTPServer для "отправки" сообщения
Я использую CocoaHTTPServer в приложении MacOSX (сервер), который обслуживает локальный каталог изображений. У меня есть соответствующее приложение для iOS (клиент), которое использует AFHTTPRequestOperation (AFNetworking) для получения файла изображения с Mac по локальной сети. Это работает хорошо.
Далее я хотел бы, чтобы, когда пользователь выбирает определенное изображение в приложении Mac, приложение iPad получает уведомление о загрузке этого изображения и его отображении.
Метод, который я сейчас использую, состоит в том, чтобы обслуживать простой файл imageToDisplay.txt, который включает имя файла изображения для отображения. Приложение для iPad постоянно опрашивает этот файл, и если имя файла меняется, оно загружает его и т. Д. Оно работает, но кажется неуклюжим. Я думал о реализации метода GET на сервере, который также возвращает имя файла. Этот подход все еще потребует опроса клиента.
Есть ли более элегантный способ инициировать загрузку (без опроса) с уже имеющимися фрагментами? По сути отправка сообщения с сервера на клиент - "скачать image27.jpg сейчас"
1 ответ
WebSockets (SocketRocket)
Есть несколько способов реализовать это. Как отмечено в комментариях, WebSockets один. Наиболее надежной свободно доступной библиотекой WebSockets для iOS является SocketRocket (которая рифмуется). На странице, на которую я только что ссылался, приведен пример кода (также рифмующегося), поэтому я не буду здесь его включать.
AFNetworking
Поскольку вы уже используете AFNetworking, вы также можете взглянуть на новый AFNetworking 2.0 (который будет выпущен в ближайшее время), который включает в себя поддержку сетей реального времени через Rocket.
Это позволит вашему приложению поддерживать открытое соединение и будет выглядеть примерно так:
[client SUBSCRIBE:@"/currentImage" usingBlock:^(NSArray *operations, NSError *error) {
for (AFJSONPatchOperation *operation in operations) {
switch (operation.type) {
case AFJSONReplaceOperationType:
// replace old image with new image
break;
default:
break;
}
}
} error:nil];
Пока ваш клиент не отменяет, он будет продолжать получать обновления с сервера всякий раз, когда они происходят.
Ваш сервер должен будет отправлять данные в соответствующем формате, и есть экспериментальная ветка Rack::Scaffold, которая делает это.
Заметки
Эти подходы могут быть излишними, если вы меняете свое изображение только раз в неделю; в этом случае вы должны кэшировать изображение в течение некоторого разумного периода времени.