Использование 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, которая делает это.

Заметки

Эти подходы могут быть излишними, если вы меняете свое изображение только раз в неделю; в этом случае вы должны кэшировать изображение в течение некоторого разумного периода времени.

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